题目
定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?
#include<iostream>
using namespace std;
class vehicle
{
public:
void Run(){cout<<"车开始运行"<<endl;}
void Stop(){cout<<"车停止运行"<<endl;}
protected:
int MaxSpeed;
int Weight;
};
class bicycle:virtual public vehicle
{
protected:
int Height;
};
class motorcar:virtual public vehicle
{
protected:
int SeatNum;
};
class motorcycle:public bicycle,public motorcar
{
public:
motorcycle(int m,int w,int h,int s)
{
MaxSpeed=m,Weight=w,Height=h,SeatNum=s;
}
void show()
{
cout<<"MaxSpeed:"<<MaxSpeed<<"\nWeigght:"<<Weight<<"\nHeight:"<<Height<<"\nSeatNum:"<<SeatNum<<endl;
}
};
int main()
{
motorcycle mo(100,150,130,2);
mo.Run();
mo.show();
mo.Stop();
return 0;
}
虚基类的声明是在派生类的声明过程中的,其语法结构:
class 派生类名:virtual 继承方式 基类名
1.为什么要引入虚基类?
在类的继承中,如果我们遇到这种情况:
“B和C同时继承A,而B和C都被D继承”
在此时,假如A中有一个函数fun()当然同时被B和C继承,而D按理说继承了B和C,同时也应该能调用fun()函数。这一调用就有问题了,到底是要调用B中的fun()函数还是调用C中的fun()函数呢?在C++中,有两种方法实现调用:
(注意:这两种方法效果是不同的)
使用作用域标识符来唯一表示它们比如:B::fun()
另一种方法是定义虚基类,使派生类中只保留一份拷贝。
————————————————
版权声明:本文为CSDN博主「萧潇逍肖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43819313/article/details/84572264