#include <iostream>using namespace std; class A { protected: int m_data; public: A(int data = 0){m_data = data; } int GetData(){return doGetData();} virtual int doGetData(){ return m_data;/*m_data = 0 */} //介面,如不直接調用,則調用衍生類別中實現他的函數 }; class B:public A { protected: int m_data; public: B(int data = 1){m_data = data; } //這裡 A 中的m_data = 0 ,B中的m_data = 1 int doGetData(){ return m_data ;/*m_data = 1 */} //實現介面 }; class C:public B //C繼承了A&B類的方法&屬性,且未從新定義介面,故介面還是B類中定義的{ protected: int m_data; public: C(int data = 2){m_data = data; } //這裡 A 中的m_data = 0 ,B中的m_data = 1,C 類中的m_data = 2};int main(){C c(10);cout<<c.GetData()<<endl;//本來是要調用C類的GetData(),C中未定義,故調用B中的,但是B中未定義,故調用A中的GetData(),因為A中的doGetData()是虛函數,所以調用//B類中的doGetData(),而B類的doGetData()返回B::m_data,故輸出 1cout<<c.A::GetData()<<endl;//因為A中的doGetData()是虛函數,又因為C類中未重定義該介面,所以調用B類中的doGetData(),而B類的doGetData()返回B::m_data,故輸出 1cout<<c.B::GetData()<<endl;//肯定返回 1 了cout<<c.C::GetData()<<endl;//因為C類中未重定義GetData(),故調用從B繼承來的GetData(),但是B類也未定義,所以調用A中的GetData(),因為A中的doGetData()是虛函數,所以調用B類中的doGetData(),而B類的doGetData()返回B::m_data,故輸出 1cout<<c.doGetData()<<endl;//肯定是B類的傳回值 1 了cout<<c.A::doGetData()<<endl;//因為直接調用了A的doGetData(),所以輸出 0 了cout<<c.B::doGetData()<<endl;//因為直接調用了B的doGetData(),所以輸出 1 了cout<<c.C::doGetData()<<endl;//因為C類中未重定義該介面,所以調用B類中的doGetData(),而B類的doGetData()返回B::m_data,故輸出 1system("PAUSE");return 0;}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
原文:http://www.programfan.com/CLUB/showpost.asp?id=21686