【问题标题】:C++ - Multilevel InheritanceC++ - 多级继承
【发布时间】:2020-04-21 15:20:36
【问题描述】:

我是 C++ 新手,这是我第一次学习继承。我对想要讨论的多级继承有些困惑。

考虑这段代码:

class Parent 
{
  ...
  virtual void foo() {...} // virtual function
  ...
}
class Child
  : public Parent
{
  ...
  virtual void foo() override {...} // 1
  ...
}
Class GrandChild
  : public Child
{
  ...
  void foo() override {...} // 2
  ...
}

现在,

  1. 我知道1 会覆盖Parent 类方法。
  2. 但是,我不确定2。它覆盖了哪个方法,Parent 中的那个还是Child 中的那个?

如果我错了,请纠正我。另外,如果有任何有用的文章,请给我参考。

【问题讨论】:

  • 如果您显示真实代码会更容易。特别是不清楚您在 4 中的意思。使用发布的代码,看不到任何效果。也请每个问题一个问题

标签: c++ inheritance multi-level


【解决方案1】:

我想说GrandChild 类在这里覆盖了Child 方法。然而,这并不是一个非常有用的区别,因为GrandChild 继承自ChildParent(间接地)。因此,您可以执行以下所有操作:

int main() {
    Parent* p1 = new Child();
    p1->foo(); // calls Child::foo

    Parent* p2 = new GrandChild();
    p2->foo(); // calls GrandChild::foo

    Child* c = new GrandChild();
    c->foo();  // calls GrandChild::foo

    // cleanup all of the pointers
}

【讨论】:

  • 如果我将Child类中的声明改为void foo() override {...}会怎样? Child::foo()GrandChild 类意味着什么。
  • 什么都没有——无论实际实例的类型是什么,这就是将调用的方法。只要最顶层的类在其签名中包含virtual,这很重要:所有具有相同名称的派生方法都自动成为virtual。事实上,如果不是virtual,使用override 会报错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多