扩展基类并在不更改派生类的情况下使用该功能
Extending base class and using the feature without altering the derived classes
我有一个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
应该继承自FourWheelVehicleWithoutSeatBelts
和VehicleWithSeatBelts
类。也许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";}
};
这将通过公共继承将安全带和四轮车交给汽车
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 扩展基类并在不更改派生类的情况下使用该功能
- C 交叉相关单例.在没有朋友的情况下,我如何使用彼此的功能
- 如何在不接触函数本身的情况下暂停和恢复 C++11 std::thread 的功能
- 如何在不复制的情况下将向量向量从类函数传递到功能
- 模板专业化的情况下,如果有变态模板功能
- 如何在没有对象的情况下执行插槽功能
- 如何在不引起实例化的情况下获取功能模板的签名
- 在这种情况下,(N)RVO是否适用于我的功能
- 默认情况下,如何制作功能指针参数NO-OP
- 在不违反干prinicple的情况下,对传递功能对象的参数类型进行模板选择
- 在不发送任何内容的情况下获取功能的返回
- LDAP函数中是否有任何功能可以在不使用ldap_search的情况下获取用户信息
- 如何在不破坏现有代码的情况下将输出参数添加到功能
- 我可以在不使用标准API功能的情况下创建过程
- 如何创建模板功能在容器和类型都是参数的情况下
- 如何在不沮丧的情况下调用派生类的成员功能
- 在这种情况下更好的是内联功能的宏
- 在内联和 constexpr 功能的情况下"obey ODR"意味着什么?
- 我不能在不使用指针的情况下返回 2d 数组!我正在制作一个井字游戏类型游戏,这是我的向上移动功能