2011-07-25 10 views
3

次の2つのクラスがあります。Aは仮想デストラクタを持つ基本クラスで、Bはデストラクタが 'virtual'修飾子を持たない派生クラスです。私はBから複数のクラスを派生する予定ならば私の質問はBのデストラクタが自動的にvirtualnessを継承するか、私は明示的に「仮想」の前に「〜B(){...}」派生クラスのメンバー関数は、基本クラスから仮想を継承していますか?

class A 
{ 
public: 
    A() { std::cout << "create A" << std::endl;}; 
    virtual ~A() { std::cout << "destroy A" << std::endl;}; 
}; 

class B: A 
{ 
public: 
    B() { std::cout << "create B" << std::endl;}; 
    ~B() { std::cout << "destroy B" << std::endl;}; 
}; 
を配置する必要があります、です

答えて

6

仮想メンバ関数vfがクラスDerivedクラスBaseおよび に宣言された場合には、直接的または間接的に誘導されますBase,[...] Derived::vfまた、仮想(宣言されているかどうかにかかわらず) 。

はい。

1

バーチャルネスはすべて下に継承されます。あなたは一番上の基底クラスでそれを指定する必要があります。

これは、デストラクタおよび通常のメンバ関数に当てはまります。

例:C++標準(セクション10.3)から

class Base { virtual void foo() { std::cout << "Base\n"; } }; 
class Derived1 : public Base { void foo() { std::cout << "Derived1\n"; } }; 
class Dervied2 : public Derived1 { void foo() { std::cout << "Derived2\n"; } }; 

int main() 
{ 
    Base* b = new Base; 
    Base* d1 = new Derived1; 
    Base* d2 = new Derived2; 
    Derived1* d3 = new Derived2; 

    b->foo(); // Base 
    d1->foo(); // Derived1 
    d2->foo(); // Derived2 
    d3->foo(); // Derived2 
} 
6

基本クラスのメソッドがvirtualの場合、その後のすべての派生クラスのメソッドはvirtualになります。しかし、IMOはメソッドの前にvirtualを置くことは良いプログラミングの練習です。関数の性質を読者に示すだけです。

はまた、あなたが予期しない結果を得るかもしれないいくつかのコーナーケースがあることに注意してください。実際に、B::foo()virtualメカニズムとA::foo()オーバーライドされていません。ここ

struct A { 
    virtual void foo(int i, float f) {} 
}; 

sturct B : A { 
    void foo(int i, int f) {} 
}; 

を。むしろそれを隠している。したがって、あなたに関係なく、B::foo()バーチャルにすると利点はありません。

C++ 0xでは、このような問題を克服するoverrideキーワードがあります。

1
or I need to explicitly put 'virtual' before '~B() {...}' 

いいえ、必要はありませんが、読者にはコードをより明確にするためにここに仮想を入れることができます。これは、デストラクタだけでなく、すべてのメンバ関数に適用されます。

関連する問題