C++虚继承的意义和使用
程序员文章站
2022-07-15 16:51:32
...
虚继承:多个派生类保存相同基类的同名成员时,虽可以在不同的数据成员中分别存放不同的数据 ,但我们只需要相同的一份。
解决了多父类重复成员只保留一份的问题。
比如现在有一个沙发床,它既有床的属性又有沙发的属性,它们都有长宽高的属性,但是我们却只需要知道它的一个状态的属性。
它的一个长宽高能体现多个状态。
家具{
属性:长,宽,高;
}
沙发床:public 沙发,public 床{
属性:长,宽,高;
}
沙发:public 家具 ----》改为:沙发:virtual public 家具
{
属性:长,宽,高;
}
床:public 家具 ----》改为:床:virtual public 家具
{
属性:长,宽,高;
}
我们只需要他们的共同属性长宽高就行了,我们可以把共同属性提出来作为家具类,再由不同状态继承(虚继承),但最后都归总于沙发床。
#include <iostream>
using namespace std;
class Base{
public:
Base(int d=100):data(d){
cout<<"Base()"<<data<<endl;
}
int data;
};
class A :virtual public Base{
public:
A():Base(){
cout<<"A()"<<data<<endl;
}
void setD(int d)
{
data = d;
}
};
class B :virtual public Base{
public:
B():Base(){
cout<<"B()"<<data<<endl;
}
int getD()
{
return data;
}
};
class C :public A,public B{
public :
C():A(),B(),Base(100){
cout<<"C()"<<data<<endl;
}
void dis(){
cout<<data<<endl;
cout<<A::data<<endl;
cout<<B::data<<endl;
}
};
int main(){
C c;
c.dis();
c.setD(10000);
c.setD(2000);
cout<<c.getD()<<endl;
c.dis();
}
更改床、沙发、沙发床的长宽高它们的不同状态的长宽高都会发生变化。
转载自:https://blog.csdn.net/blank__box/article/details/78239208