当一个类(class dd)的多个基类(class bb, cc)都是基于同一个基类(class aa)派生得到时,这个类中会保留这些基类中的所有同名成员。
如果不声明虚基类,aa中的同名成员在会根据访问情况输出不同的结果。
访问注意事项:
在派生类中,所有同名成员名前,加对应基类名。
格式:
基类名::成员名
#include <iostream>
#include <string>
using namespace std;
class aa
{
protected:
int a;
public:
aa()
{
a = 10;
cout << "aa a = "<< a << endl;
}
};
class bb :public aa
{
public:
bb()
{
a += 10;
cout << "bb a=" << a << endl;
}
};
class cc :public aa
{
public:
cc()
{
a -= 10;
cout << "cc a="<<a << endl;
}
};
class dd :public bb, public cc
{
public:
dd()
{
cout << "bb a=" << bb::a << endl;
cout << "cc a=" << cc::a << endl;
}
};
int main()
{
dd obj1;
return 0;
}
如果声明虚基类,dd类中,不论访问情况如何,始终都会有同一个输出,中间虚基类的输出则由定义顺序决定:
格式:
class 派生类名:virtual 继承方式 类名{};
#include <iostream>
#include <string>
using namespace std;
class aa
{
protected:
int a;
public:
aa()
{
a = 10;
cout << "aa a = "<< a << endl;
}
};
class bb:virtual public aa
{
public:
bb()
{
a += 10;
cout << "bb a=" << a << endl;
}
};
class cc :virtual public aa
{
public:
cc()
{
a =a +20;
cout << "cc a="<<a << endl;
}
};
class dd :public bb, public cc
{
public:
dd()
{
cout << "bb a=" << bb::a << endl;
cout << "cc a=" << cc::a << endl;
}
};
int main()
{
dd obj1;
return 0;
}
结果