假设我有这段代码:
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()吗?
答案 0 :(得分:5)
1。)是LandVehicle
仍然是抽象的。对于可实例化的类,您需要实现所有纯虚方法。
2。)是的。 override
是编译器的关键字,它应该覆盖另一个方法。如果你是更改基类中的签名。编译器会在这里给你一个错误(如果你不使用覆盖它假设它是一个" new"方法)
3。)与2.用户覆盖相同的答案如果覆盖方法,则尽可能经常覆盖。
4。)是的。所有纯虚拟(抽象)方法现在都有一个实现。
5.)否。虚拟只需要添加到基类中。在相同方法的派生类中不需要它。
6。)是的。 overrride
只是编译器要检查的关键字。它不会覆盖或不覆盖(virtual
对此非常重要)。如果声明你可以保留覆盖,但它总是更安全地使用它。
7。)是的,您可以使用LandVehicle::media()