1. 程式人生 > >C++在多層繼承中呼叫虛擬函式

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();//呼叫cshow方法。

    cobj.B::show();//呼叫Bshow方法。

    cobj.A::show();//呼叫ashow方法。

    A &refaobj=cobj;//引用。

    refaobj.

show();//呼叫的是 ashow方法。

    B &refbobj=cobj;

    refbobj.show();//呼叫的是cshow方法。

    refbobj.B::show();//呼叫的是bshow方法。

    return 0;

}

   在程式中,我們將類B的show()函式宣告為虛擬函式,所以在類c繼承了類B後,它的show()函式也將是虛擬函式,因此在當類c的物件呼叫 show()函式時,它呼叫的是自己的成員。

    由於類A中沒有宣告虛擬函式,所以它的物件或引用呼叫show()時,也都將呼叫的是自己的成員

    類B宣告自己的show()函式為虛擬函式,所以類c的物件初始化它的引用,類B的引用呼叫的是類C的成員函式。