c++ - C++ 接口可以从具有完整实现的类继承吗?
问题描述
我有一个特定的类结构,虽然我觉得当项目变得更大时它可能会变得有点混乱。总体思路如下:
所有可能的车辆都有一个类,其基本实现不会因任何车辆而改变,无论其具体类型如何。那么,对于所有的汽车,都应该有一个只有汽车才能拥有的功能的接口。这个界面是纯虚拟的。然后,任何汽车都可以根据需要实现这些功能。我在下面包含了一个非常简单的代码示例:
class Vehicle { //general class for a vehicle
public:
void move() {
std::cout << "I moved\n";
}
void crash() {
std::cout << "I crashed\n"
}
};
class CarInterface : public Vehicle { //purely virtual interface for cars
public:
virtual void refuel() = 0;
};
class Ferrari: public CarInterface { //implementation: one specific car
public:
void refuel() override {
std::cout << "I use ferrari fuel\n"
};
};
在 c++ 指南中,它说您应该区分实现继承和接口继承。这是否仍然满足该要求?
解决方案
C++ 接口可以从具有完整实现的类继承吗?
C++ 语言不区分接口和其他类。这种区别纯粹是传统的。因此,从一个角度来看,说 C++ 接口不能[无论如何] 是正确的,因为没有 C++ 接口这样的东西。
如果我们将接口视为一个抽象概念,那么答案取决于人们如何选择解释该概念,并根据语言对其进行精确指定。如果解释是接口类只有纯虚成员函数(这是一种常见的解释),那么CarInterface
就不是接口,因为它通过继承具有非纯虚成员函数。
在 c++ 指南中
我想您打算参考“C++ 核心指南”。这就是那里定义概念的方式:
注释定义:
- 接口继承是使用继承将用户与实现分开,特别是允许添加和更改派生类而不影响基类的用户。
- 实现继承是使用继承来简化新设施的实现,通过为相关新操作的实现者提供有用的操作(有时称为“差异编程”)。
纯接口类只是一组纯虚函数;见 I.25。
这有点含糊,但我会解释为接口继承和实现继承CarInterface
的一种形式,它不是纯接口。
在定义下方以及第 I.25 节中,指南将这种混合继承作为一个不好的示例进行了演示,并提出了使用纯接口的替代方案。
您的示例可以通过使用虚拟继承实现纯接口和重用(这可能是您的Vehicle
类的用途):
// pure interface
class VehicleInterface {
public:
virtual void move() = 0;
virtual void crash() = 0;
};
// pure interface
class CarInterface : public virtual VehicleInterface {
public:
virtual void refuel() = 0;
};
class CommonVehicle : public virtual VehicleInterface {
public:
void move() override;
void crash() override;
};
class Ferrari: public CarInterface, private CommonVehicle {
public:
void refuel() override;
};
推荐阅读
- postgresql - 过滤掉奇数(乱序)行
- java - VM 中的分布式 Java RMI
- r - R ggspot2中并排的箱线图和绘图点
- android - Waze Android 地理 URI 不起作用
- cpanel - 如何通过cpanel找到my.cnf文件?
- python - 将 TensorFlow LSTM 转换为 Keras
- php - PHP && 运算符
- oracle - apex.oracle.com 上的数据库将连接到气流
- javascript - 对象数组到数组数组以字符串形式出现
- javascript - 在同一页面上使用 javascript 或 AJAX 更改 PHP 变量