C++在多層繼承中呼叫虛擬函式
在一個類中的虛擬函式說明,只對派生類中重定義的函式有影響,對它的基類中的函式不起作用。
例:
#include <iostream>
usingnamespacestd;
class A
{
public:
void show()
{
cout<<"The show in A."<<endl;
}
};
class B:publicA
{
public:
virtual void show()
{
cout<<"The show in B."<<endl;
}
};
class C:publicB
{
public:
void show()
{
cout<<"The show in C."<<endl;
}
};
int main(int argc, const char * argv[])
{
C cobj;
cobj.show();//呼叫c的show方法。
cobj.B::show();//呼叫B的show方法。
cobj.A::show();//呼叫a的show方法。
A &refaobj=cobj;//引用。
refaobj.
B &refbobj=cobj;
refbobj.show();//呼叫的是c的show方法。
refbobj.B::show();//呼叫的是b的show方法。
return 0;
}
在程式中,我們將類B的show()函式宣告為虛擬函式,所以在類c繼承了類B後,它的show()函式也將是虛擬函式,因此在當類c的物件呼叫 show()函式時,它呼叫的是自己的成員。
由於類A中沒有宣告虛擬函式,所以它的物件或引用呼叫show()時,也都將呼叫的是自己的成員
類B宣告自己的show()函式為虛擬函式,所以類c的物件初始化它的引用,類B的引用呼叫的是類C的成員函式。