【问题标题】:C++ abstract class inheritance [closed]C++抽象类继承[关闭]
【发布时间】:2017-01-12 19:43:12
【问题描述】:

假设我有这段代码:

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 类中的关键字 override 使用是否正确?作为抽象类的派生类,它真的覆盖了方法吗?

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

4) 现在 Train 是一个具体的类吗?

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

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

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

它是隐藏 LandVehicle 的 media() 还是覆盖它?

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

【问题讨论】:

  • 问题太多了,大部分你自己测试一下就能很快找到答案。
  • 你试过自己研究这个吗?您发现了什么,它如何未能回答您的问题?
  • 我同意这里。快速编写代码/测试输出通常比在 stackoverflow 上输入代码/问题还要快。

标签: c++ inheritance


【解决方案1】:

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

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

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

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

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

6.) 是的。 overrride 只是编译器检查的关键字。它并没有真正覆盖或不覆盖(virtual 对此很重要)。如果声明,您可以忽略覆盖,但始终使用它通常更安全。

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

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多