2016-04-16 5 views
0

私は本当に非仮想メソッドを上書きするという点は見当たりません。なぜなら、オリジナルのベースと時には子のメソッドが呼び出される可能性のあるバグの全範囲を作成するからです。最終的に非仮想メソッドを常にマークするのは良い考えですか?

ロジックに従うと、メソッドを作成することは常に簡単なルールになります。 このメソッドをオーバーライドできますか? Yesの場合 - virtualとマークし、ない場合はfinalとマークします。

私にとってそれはすべてうまく聞こえますが、私は本当に何か重要なものが欠けているのだろうと思っています。

+4

A)仮想メンバー以外の機能を無効にすることはできません。 B)非仮想メンバ関数を 'final'としてマークしようとしましたか? – juanchopanza

+2

非仮想メソッドをオーバーライドすることはできません。非仮想メソッドを非表示にすることはできません。非仮想メソッドには 'final'を使用できません。 – milleniumbug

+1

Clangはこのエラーでエラーを出します:仮想メンバー関数だけに 'final''とマークすることができるので、' no 'を指定します。 – JVApen

答えて

1

非仮想関数を含み、非仮想関数がすべてfinalであり、C++標準に準拠するプログラムでは、完全にバグがないことが保証されています。

だからです。

まだ:私はそれに対して助言します。

これも存在しません。 final位置指定キーワードは、virtual機能にのみ適用できます。最初の段落は、空白の満足の冗談として知られています。例がないので、存在しないもののすべての例はすべての特性を持っています。

非上書きのvirtual final関数を作成すると、それを読んでいる人にとって混乱することになります。それは、子孫型が同じシグネチャを持つメソッドを宣言するのを防ぎますが、シグネチャがわずかに異なるのを防ぐわけではないので、ほとんど意味がありません。

1

あなたが書いた各メンバ関数は、明示的に上書きされるように設計されているか、または不変でなければなりません。しかし、仮想性は、階層の最上部に追加する必要があります。途中で追加することはできません。ただし、仮想メンバー関数finalをマーキングすることで、このクラスからの仮想化を「取り除く」ことができます。

finalは仮想メンバー機能にのみ適用できるので、以下の説明では非仮想メンバー機能は考慮しません。

一般的なプラクティスは、継承階層の途中でクラスをインスタンス化せず、階層の「リーフ」クラスを継承しない場合に、直接使用または継承のクラスを設計することですが、 。このプラクティスはMore Effective C++本33章で一般に公開されています。このプラクティスに従う場合は、リーフクラスのすべての仮想関数finalをマークして、ルールの違反を見つけるのを助けます。

+0

'struct base {int x(){return 1; }}; struct mid:base {仮想int x(){戻り値2; }}; struct bottom:mid {仮想int x(){戻り値3; }}; 'は有効なプログラムではありませんか? (それは貧しいプログラムですが、そうではありません) – Yakk

関連する問題