首页 > 解决方案 > 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++inheritanceinterfaceimplementation

解决方案


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;
};

推荐阅读