bri*_*gge 3 c++ inheritance virtual-inheritance
我有以下两个接口,它们不是继承层次结构的一部分.然后我有两个具体的类,一个来自另一个.
class ICar {
public:
virtual void drive() = 0;
};
class IFastCar {
public:
virtual void drive() = 0;
virtual void driveFast() = 0;
};
class Car : public virtual ICar {
public:
void drive() {};
};
class FastCar : public Car, public virtual IFastCar {
public:
void driveFast() {};
};
int main()
{
FastCar fc;
fc.drive();
fc.driveFast();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到以下错误:
error: cannot declare variable `fc' to be of type `FastCar'
error: because the following virtual functions are abstract:
error: virtual void IFastCar::drive()
Run Code Online (Sandbox Code Playgroud)
如果我在FastCar中编写一个函数来将drive()委托给基类,我的程序将会起作用
void drive() { Car::drive(); }
Run Code Online (Sandbox Code Playgroud)
是否可以在没有编写方法的情况下将FastCar编译为委托给基类?
注意:ICar和IFastCar由两个不同的团队创建,分为两个不同的项目.团队已就共享的操作的共同方法签名达成一致.我在实现类中使用了继承来尝试重用相同的实现部分.
问题在于这里发生了多重继承......即使FastCar是派生自的Car,drive()基类中的版本Car只会覆盖ICar::drive(),而不是IFastCar::drive().因此,既然你是派生FastCar的IFastCar,你需要在某个时候定义一个函数FastCar,同时覆盖纯虚拟抽象方法IFastCar::drive()......继承Car::drive()不会自动覆盖,IFastCare::drive()因为它不会从该类继承. IFastCar::drive()并且ICar::drive()是两个不同的纯抽象虚函数,需要单独重写.如果你想创建用于IFastCar::drive()调用继承Car::drive()函数的接口,那么你将需要委托那个继承的函数,就像你在一个FastCar::drive()特别调用它的基类的版本的版本中那样drive().