扩展基类并在不更改派生类的情况下使用该功能

Extending base class and using the feature without altering the derived classes

本文关键字:情况下 功能 派生 基类 扩展      更新时间:2023-10-16

我有一个C++基类,其中包含一些派生类。如果我稍后通过继承扩展基类,它会反映已经派生的类中的更改。为了使我的问题更清楚,请考虑以下代码。

#include <iostream>
class FourWheelVehicle
{
public:
FourWheelVehicle()
{std::cout<<"FourWheelVehicle createdn";}
};
class Car: public FourWheelVehicle
{
public:
Car()
{std::cout<<"Car createdn";}
};
class Toyota: public Car
{
public:
Toyota()
{std::cout<<"Toyota Car createdn";}
};
class Audi: public Car
{
public:
Audi()
{std::cout<<"Audi Car createdn";}
};
int main()
{
Toyota t;
std::cout<<"..............................n";
Audi a;
return 0;
}

如何将四轮车扩展到带安全带的四轮车,以便我之前派生的所有汽车都能在不更改代码的情况下获得安全带? 我尝试了以下方法:

FourWheelVehicle
/      
/        
/          
Car          
/            
/              
Toyota Audi    FourWheelVehicleWithSeatBelt
class FourWheelVehicleWithSeatBelt: public FourWheelVehicle
{
public:
FourWheelVehicleWithSeatBelt()
{std::cout<<"FourWheelVehicleWithSeatBelt createdn";}
};

上面的方案似乎行不通!

类不继承自同级类。在您的图中,期望Car获取FourWheelVehicleWithSeatBelt的特征就像期望Toyota获取Audi的特征一样。它不会发生。

若要在继承链中获取另一个类,新类需要进入链中,而不是在新分支中。由于您(出于某种原因(无法更改派生类,因此它们仍必须从FourWheelVehicle继承。这让您看到如下所示的内容:

????
/
/
/
FourWheelVehicle
/
/
/
Car
/
/  
Toyota Audi

对此有一种直截了当的方法。将当前FourWheelVehicle类重命名为其他名称(FourWheelVehicleWithoutSeatBelts?(,然后创建一个继承自FourWheelVehicleWithoutSeatBelts并添加安全带的新FourWheelVehicle类。或者,也许新FourWheelVehicle应该继承自FourWheelVehicleWithoutSeatBeltsVehicleWithSeatBelts类。也许Vehicle将是这个方案中的虚拟基类。

命名方案很奇怪,但由于您无法更改派生类的代码,因此您可能会遇到这种情况。这是从不适当的设计开始的危险之一。(请注意,"不足"并不总是设计师的错。有时是这样,但有时项目需求的变化是不可预测的。

(就个人而言,我会尝试获得更改Car定义的许可,以便可以使用更合理的命名方案。Car的孩子不需要改变。有时好的程序设计意味着与其他人交谈。

好吧,在这种情况下,我不确定如果所有派生类都需要它,为什么您需要阻止修改基类。但是,如果您仍然想以这种方式执行此操作,则可以使用多重继承来实现,例如:

#include <iostream>
class FourWheelVehicle
{
public:
FourWheelVehicle()
{std::cout<<"FourWheelVehicle createdn";}
};
class SeatBelt
{
public:
SeatBelt()
{std::cout<<"Seatbelt createdn";}
};
class Car: public FourWheelVehicle, SeatBelt
{
public:
Car()
{std::cout<<"Car createdn";}
};

这将通过公共继承将安全带和四轮车交给汽车