C++抽象类继承

Loa*_*oay -11 c++ inheritance

假设我有这段代码:

class Vehicle {
   virtual const char* media() const = 0;
   virtual unsigned speed() const = 0;
} V, *PV;
class LandVehicle : public Vehicle {
   const char* media() const override{ return "Land";}
} L,  *PL;
class Train : public LandVehicle{
   virtual unsigned speed() const override {return 130;}
} T, *PT;
Run Code Online (Sandbox Code Playgroud)

我有几个问题:D

1)LandVehicle没有实现速度().这是一个错误,如果是这样,会出现什么样的错误?或者它只是使它成为一个抽象类?

2)是正确使用方法media()中的类LandVehicle中的关键字覆盖?作为抽象类的派生类,它真的覆盖了方法吗?

3)与Train的speed()方法中的覆盖相同.

4)现在培养一个具体课程?

5)是否有必要在LandVehicle的media()方法的声明中添加关键字virtual

6)如果我在Train类中添加此方法:

const char* media() const{ return "Just a train";}
Run Code Online (Sandbox Code Playgroud)

它隐藏了LandVehicle的媒体()还是覆盖它?

7)在6中添加方法后,可以在Train类中访问LandVehicle的media()吗?

Hay*_*ayt 5

1.)LandVehicle的仍然是抽象的.要使类可实例化,您需要实现所有纯虚方法.

2.)是的.override是编译器的关键字,它应该覆盖另一个方法.如果您例如更改基类中的签名.编译器会在这里给你一个错误(如果你不使用覆盖它假设它是一个"新"方法)

3.)相同的答案2.用户覆盖尽可能多的覆盖方法.

4.)是的.所有纯虚拟(抽象)方法现在都有一个实现.

5.)否.虚拟只需要添加到基类中.对于相同的方法,派生类中不需要它.

6.)是的.overrride只是编译器要检查的关键字.它没有真正做到或不做(virtual对此重要).如果声明你可以保留覆盖,但总是更安全地使用它.

7.)是的,你可以使用LandVehicle::media()