类的继承试验任务(3)

文章讨论了在C++中为何需要引入虚基类的概念,通过一个车辆类继承的例子,解释了如果不使用虚基类可能导致的二义性问题。虚基类确保在多继承情况下,基类的成员在派生类中只有一份拷贝,避免了重复和冲突。文章还给出了一个包含车辆、自行车、汽车和摩托车类的代码示例,展示了虚基类的使用。
摘要由CSDN通过智能技术生成

题目
定义一个车(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值