请看下面例题给出答案:
#include <iostream>
using namespace std;
class A
{
public:
A(int data= 0){m_data = data;}
int GetData() {return doGetData();}
virtual int doGetData(){return m_data;}
protected:
int m_data;
};
class B:public A
{
public:
B(int data=1){m_data = data;}
int doGetData(){return m_data;}
protected:
int m_data;
};
class C:public B
{
public:
C(int data = 2){m_data = data;}
protected:
int m_data;
};
int main()
{
C c(10);
cout<<c.GetData()<<endl;
cout<<c.A::GetData()<<endl;
cout<<c.B::GetData()<<endl;
cout<<c.C::GetData()<<endl;
cout<<c.A::doGetData()<<endl;
cout<<c.B::doGetData()<<endl;
cout<<c.C::doGetData()<<endl;
return 0;
}
记住两点,即可知答案:
1.构造函数从最初的基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量。
2.再注意一个就近调用原则,如果父辈存在相关接口,则优先调用,父辈接口,如果父辈不存在相关的接口则调用祖父辈接口