2011-07-25 56 views
3

假設我們有以下兩類,A是基類與虛擬析構函數,B是派生類其析構函數不具有「虛擬」限定符。我的問題是,如果我去的B獲得更多的類,將B的析構函數自動繼承虛擬性或我需要明確提出「虛擬」之前「〜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

從C++標準(部分10.3):

如果虛擬成員函數vf在類Base和 類Derived被聲明,直接或間接衍生從Base[...] 然後Derived::vf也是虛擬(它是否被這樣聲明) 。

所以,是的。

1

虛擬性一直被繼承下來。您只需要在頂級基類中指定它。

這是析構函數,以及正常的成員函數真。

實施例:

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放在該方法之前是一種很好的編程習慣;只是爲了向讀者指出函數的性質。

也注意到,有一些角落情況下你可能會得到意想不到的結果:

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

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

這裏實際上,B::foo()不覆蓋A::foo()virtual機制;而是隱藏它。所以不管你做什麼B::foo()虛擬,都沒有優勢。

在C++ 0X,就得override關鍵字,它克服了這種問題。

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

不,你不需要,雖然你可以把虛擬放在這裏,使代碼更清晰的讀者。這不僅適用於析構函數,也適用於所有成員函數。

相關問題