2014-09-04 105 views
3

我有一個關於在C++中的虛函數的問題,例如,A是一個基類,以及類繼承BA,和類繼承CB,我們可以定義在B一個虛擬函數,並重新定義它在C?我的意思是,如果A這個虛擬函數被定義,因爲A是所有BC的基類(即BC的根)哪裏可以定義虛擬功能?

+0

'virtual'適用於不是超類的子類。 – 101010 2014-09-04 14:30:45

+0

「重新定義」?你的意思是過載或重載? – Niall 2014-09-04 14:31:02

+0

我的意思是在B和C中實現虛函數是不同的 – ratzily 2014-09-04 14:31:54

回答

4

並非它不一定是... B是A的專用對象,並且很可能B具有比A更多的特徵。並且如果C被派生出來,它是非常正常具有選自B覆蓋的功能未在A定義

  • 假設A是一個表格
  • 假設B是一個圓...一個圓圈有一個GetDiameter函數,表單沒有。
  • 我們假設C是一個橢圓,雖然橢圓沒有實際的直徑,但GetDiameter函數被覆蓋以獲得兩個直徑中「最小」的直徑。
1

是的,這不是問題都沒有 - 試試吧:

class A 
{ 

} 

class B : public A 
{ 
public: 
virtual void myFunc(): { std::cout << "B here!"; } 
} 

class C : public B 
{ 
public: 
virtual void myFunc(): { std::cout << "No, C here!"; } 
} 
3

virtual可以在任何地方的類層次結構中使用,但虛函數只能在子類中重寫(即它不適用於超類)。

struct A { 
    void funcA(); 
}; 

struct B : A { 
    virtual funcB(); 
}; 

struct C : B { 
    virtual funcB(); 
}; 

//.... 
    B* b = new C(); 
    b->funcB(); // calls C's implementation 
    A* a = new C(); 
    a->funcB(); // fails to compile