我在想這可能是一個重複的問題,但我嘗試閱讀幾乎所有相關的帖子,但它們都不是特定於什麼我在找。調用派生類函數而不將它標記爲多級繼承中的一個類的虛擬
好吧,我明白你不能從基類指針調用派生類中的函數,除非它被標記爲虛擬。就像在參考程序1中一樣,如果WhichClass()沒有標記爲虛擬的,它就不能調用B類的WhichClass()。
#include<iostream>
using namespace std;
class A
{
public:
const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};
int main()
{
B b;
A &a = b;
cout<<"In class "<<a.WhichClass();
return 0;
}
如果我將它標記爲虛擬的,那麼它會從基類中調用大多數派生類的函數。現在假設我添加了另一個從B繼承的類C(如程序2所示),並且如果在類B中WhichClass()未標記爲虛擬,那麼基類引用(&a)如何在Class中調用WhichClass()函數C?還有B類參考文獻(& b),當我們在程序1中觀察到它甚至沒有在B類中標記爲虛擬時,它如何在C中調用WhichClass()?
#include<iostream>
using namespace std;
class A
{
public:
virtual const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};
class C:public B
{
public:
const char* WhichClass() { return "C";}
};
int main()
{
C c;
A &a = c;
B &b = c;
cout<<"In class " << a.WhichClass() << endl;
cout<<"In class " << b.WhichClass() << endl;
return 0;
}
謝謝,只是確認了第一例。但在第二個函數中,函數沒有被標記爲虛擬的,它是如何知道它應該調用C類的WhichClass()? IMO,B類中的v表項指向B :: WhichClass(),因爲它不是虛擬的。沒有? – 2013-03-21 05:16:11
但是B繼承自A,其中函數被標記爲虛擬的,所以A具有用於其虛擬函數的vtable條目,當A被任何其他類繼承時,另一個vtable被創建用於使類派生函數虛擬的類。 – shofee 2013-03-21 05:19:03