C ++抽象类继承

时间:2016-09-05 12:22:48

标签: 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;

我有几个问题:D

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

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

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

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

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

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

const char* media() const{ return "Just a train";}

是否会隐藏LandVehicle的媒体()或是否覆盖它?

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

1 个答案:

答案 0 :(得分:5)

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

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

3。)与2.用户覆盖相同的答案如果覆盖方法,则尽可能经常覆盖。

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

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

6。)是的。 overrride只是编译器要检查的关键字。它不会覆盖或不覆盖(virtual对此非常重要)。如果声明你可以保留覆盖,但它总是更安全地使用它。

7。)是的,您可以使用LandVehicle::media()