2013-07-24 19 views
5

メソッドの仮想プロパティを継承することについて混乱があります。仮想関数の継承

クラスA、クラスB、クラスC、クラスDの4つのクラスがあるとしましょう。 クラスはこのように継承されます:A - > B - > C - > D、Aは基本クラスです。

これまでに、私はこれについて確信しています:基本クラス(クラスA)の仮想クラスメソッド宣言を開始すると、その基本クラスから派生したすべてのクラス派生クラス。 (仮想であると判定されたBおよびCクラスのメソッド)。

ここに混乱があります。基本クラスAに仮想メンバーがない場合はどうでしょうか?代わりに、クラスBが仮想メソッドを宣言しているとしましょう。私は、この変更によって、継承チェーン(CおよびDクラス)に属するすべての派生クラスの仮想関数が作成されると仮定します。論理的には、CとDのBは、一種の「基本クラス」ですよね?または私は間違っていますか?

答えて

13

正しいです。

私はこのケースで最適なソリューションをしようとしていることを思う:

#include <iostream> 

using namespace std; 

class A { 
    public: 
     void print(){ cout << "print A" << endl; }; 
}; 

class B: public A { 
    public: 
     virtual void print(){ cout << "print B" << endl; }; 
}; 

class C: public B { 
    public: 
     void print(){ cout << "print C" << endl; }; 
}; 

int main() 
{ 
    A *a = new C(); 
    B *b = new C(); 

    a->print(); // will print 'print A' 
    b->print(); // will print 'print C' 

    return 1; 
} 
5

あなたはまったく正しいです。子供はその祖先が持つものを継承する。基本クラスは、子が持つもの(新しい関数や変数など)を継承することはできません。仮想関数は、その子クラスが仮想関数の実装を変更して、基本仮想関数が呼び出されない場合、子クラスによってオーバーライドされる単純な関数です。

AはB、C、Dの基本クラスです。 BはC、Dの基本クラスであり、CはDの基本クラスです。

+0

クイック提案:基底クラスが仮想メソッドを持っている場合、私はと派生クラスに属している仮想メソッドの残りの部分を強調すべきですキーワードvirtual?もっと表現力豊かにするだけ。 –

+0

それは必要ではありません。基本クラスで一度実行すると、すべての子クラスに関数実装(そのすべて継承)を変更することができます。 – theta

+0

@RobertEagle派生クラスで 'virtual'や' override'を追加する必要はありません*、でも_yes_と言えば可能な限り、関数のセマンティクスのビジュアルリマインダを置くのがよい方法です。 * 'g ++'のようなコンパイラを使わない限り、これらの修飾子がない場合に警告を出し、警告をエラーとして扱うように指示しない限り。 –

0

もちろんできます。仮想メソッドはオーバーライドするためにオプションですので、クラスAまたはBで宣言しても問題ありません。クラスAでそのメソッドを使用したくない場合は、クラスBで宣言してください。