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