菱形继承条件
多个父类中重名的成员,继承到子类中
存在问题
- 浪费存储空间
- 子类中要访问继承下来的重名成员,则会产生二义性,为了避免冲突,访问时需要加父类的作用域信息
如何解决
- 提取公有成员组成祖父类,即虚基类
- 各父类虚继承虚基类
class 派生类名:virtual 继承方式 虚基类
code
示例多继承问题
- 子类Z 访问父类成员变量_data需要加作用域
- 子类Z 修改_data后,再获取_data值不成功
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
class X
{
public:
X(int d)
:_data(d){}
void setData(int i)
{
_data = i;
}
int _data;
};
class Y
{
public:
Y(int d)
:_data(d){}
int getData()
{
return _data;
}
int _data;
};
class Z:public X,public Y
{
public:
Z():X(2),Y(3)
{}
void dis()
{
cout<<X::_data<<endl;
cout<<Y::_data<<endl;
}
};
int main()
{
Z z;
z.dis();
z.setData(2000);
cout<<z.getData()<<endl;
return 0;
}
运行结果:
2
3
3
虚继承
- 子类D可以不加作用域访问祖父类成员
- 子类D可以修改祖父类成员,获取值成功
#include <iostream>
using namespace std;
class A{
public:
int i;
};
class B:virtual public A{
public:
B(int bi = 0){
i = bi;
}
void setData(int d)
{
i = d;
}
};
class C:virtual public A{
public:
C(int ci = 0){
i = ci;
}
};
class D:public B,public C
{
public:
D(int di){
i = di;
}
void setData(int d)
{
i = d;
}
void dis()
{
cout<<i<<endl;
}
};
int main(){
D d(1);
d.dis();
cout<<"-----------"<<endl;
d.setData(100);
d.dis();
return 0;
}
运行结果:
1
-----------
100
2512

被折叠的 条评论
为什么被折叠?



