2011-05-28 201 views
0
class Base { 
public: 
    Base(){ } 
    virtual void Bfun1(); 
    virtual void Bfun2(); 
}; 

class Derv : public Base { 
public: 
    Derv(){ } 
    void Dfun1(); 
}; 

上面的定義和下面的定義有區別嗎?他們是一樣的嗎?如果不是兩者在功能上有什麼不同?虛擬繼承查詢

class Base { 
public: 
    Base(){ } 
    void Bfun1(); 
    void Bfun2(); 
}; 

class Derv : public virtual Base { 
public: 
    Derv(){ } 
    void Dfun1(); 
}; 
+0

typo ..閱讀構造函數爲public。 class base { public: Base(){} virtual void Bfun1(); virtual void Bfun2(); }; class Derv:public Base { Derv(){} void Dfun1(); }; 上面的定義和下面的定義有區別嗎?他們是一樣的嗎?如果不是兩者在功能上有什麼不同? class base { Base(){} public: void Bfun1(); void Bfun2(); }; class Derv:public virtual Base { Derv(){} public: void Dfun1(); }; – irappa 2011-05-28 23:14:55

+0

簡答:是的,他們不一樣。長答案:讀你的書;) – 2011-05-28 23:17:54

+0

閱讀建議:[什麼是「可怕的鑽石」?](http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8)。 .. [[我應該使用虛擬繼承嗎?](http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9) – Nawaz 2011-05-28 23:26:44

回答

2

它們完全不同。所述第一組定義了Bfun1Bfun2虛擬函數,其允許覆蓋他們在派生類,並通過基類指針調用這些派生類:然而

// assume you've overridden the functions in Derived 
Base* base_ptr = new Derived; 
base_ptr->Bfun1(); // will call function in derived 

第二盤,他們只是正常功能。相反,您聲明基類爲virtual,它具有許多暗示,您最好在a good C++ book中閱讀有關內容或者搜索SO問題,我認爲我們有關於該主題的一個問題。