2016-09-05 196 views
-10

假设我有这样一段代码:C++抽象类的继承

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不执行速度()。是一个错误,如果是的话,什么样的错误?还是只是让它成为一个抽象类?

2)是关键字覆盖在类LandVehicle方法media()中使用是否正确?作为一个抽象类的派生类是否真的覆盖了该方法?

3)与2相同覆盖列车的速度()方法。

4)现在正在培训具体的课程吗?

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

6)如果我在火车类中添加这个方法:

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

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

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

+6

有太多的问题,其中大部分你可以自己测试它快速找到答案。 – Aracthor

+0

你有没有试过自己研究过?你发现了什么以及它没有回答你的问题? – Angew

+1

我同意这里。快速编写代码/测试输出通常比在stackoverflow上输入代码/问题要快。 – Hayt

回答

5

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

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

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

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

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

6.)是的。 overrride只是编译器检查的关键字。它并不是真的在做这个重要事情(virtual对此很重要)。如果声明中可以忽略重写,但总是使用它通常更安全。

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