虚基类,虚函数和纯虚函数的区别

虚基类:解决c++多重继承,有一种情况菱形继承的时候,如果不进行处理,会导致基类在派生类中会产生多个实例的情况。
在这里插入图片描述

class Book
{
public:
    std::string name;
};

class EnglishBook:public virtual Book
{
public:
    std::string bookno;
};

class MathBook :public virtual Book
{
public:
    std::string bookno;
};

class ColleageBook :public EnglishBook,
                    public MathBook
{
public:
    std::string bookownername;
};

在ColleageBook中只有一份Book类的实例,避免了多个Book基类实列的存在

虚函数:在基类中使用virtual进行声明的函数,方面在派生类中进行重写,通过虚函数可以实现c++的多态。

class Book
{
public:
    std::string name;
public:
    virtual std::string Getname()
    {
        return name;
    }
};

class EnglishBook:public  Book
{
public:
    std::string bookno;
public:
    std::string Getname()
    {
        return bookno;
    }
};

由于本文只讨论三者的区别,因此对虚函数的详细内容不过多的展开介绍。

纯虚函数:在基类中使用virtual进行声明的函数,并且没有具体的函数内容,纯虚函数参数后接“=0”;
纯虚函数必须由派生类进行重写
含有纯虚函数的类,叫做抽象类
抽象类是不能创建实例化对象的,只能由派生类进行继承。

class Book
{
public:
    std::string name;
public:
    virtual std::string Getname() = 0;
    
};

class EnglishBook:public virtual Book
{
public:
    std::string bookno;
public:
    std::string Getname()
    {
        return bookno;
    }
};
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们先定义一个基类汽车类,其中包含车辆的品牌、型号、颜色、价格等属性,以及车辆的基本行驶方法move(): ```C++ class Vehicle{ protected: string brand; //品牌 string model; //型号 string color; //颜色 double price; //价格 public: Vehicle(string brand, string model, string color, double price); virtual void move() = 0; //纯虚函数 }; ``` 接下来,我们定义两个派生类:客车类和货车类,它们继承了汽车类的属性和方法,并分别添加了自己的属性和方法: ```C++ class PassengerCar : virtual public Vehicle{ protected: int passengerNum; //载客数 public: PassengerCar(string brand, string model, string color, double price, int passengerNum); void move(); //重载虚函数 void carryPassenger(); //载客 }; class Truck : virtual public Vehicle{ protected: double loadCapacity; //载重量 public: Truck(string brand, string model, string color, double price, double loadCapacity); void move(); //重载虚函数 void carryCargo(); //载货 }; ``` 可以看到,客车类和货车类都继承了虚基类Vehicle,并且重载了虚函数move(),以适应它们各自的行驶方式。此外,它们还分别添加了自己的方法,用于载客和载货。 最后,我们再基于客车类和货车类派生一个皮卡车类: ```C++ class Pickup : public PassengerCar, public Truck{ public: Pickup(string brand, string model, string color, double price, int passengerNum, double loadCapacity); void move(); //重载虚函数 void carryCargo(); //重载虚函数 void carryPassenger(); //重载虚函数 }; ``` 可以看到,皮卡车类同时继承了客车类和货车类,因此需要使用虚基类继承。此外,皮卡车类也重载了虚函数move(),并分别重载了carryCargo()和carryPassenger()方法,以适应它既可以载货又可以载客的特点。 总结一下,虚基类虚函数纯虚函数都是面向对象编程中的重要概念,它们的作用分别如下: - 虚基类:解决多继承时的二义性问题,使得派生类只包含一份基类的成员数据。 - 虚函数:允许派生类重载基类的函数,并在运行时根据对象的实际类型调用对应的函数。 - 纯虚函数:在基类中定义函数接口,但没有提供实现,强制派生类去实现该函数,从而达到多态的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值