【问题标题】:Why is base method being called once overridden in C++为什么在 C++ 中重写一次基方法会被调用
【发布时间】:2019-05-11 21:11:18
【问题描述】:

我有类似下面的情况(代码不准确,只是为了表达我的意思)。当我打电话给D.A() 时,我希望会打印出"Desc" 这个词,但会打印出"Base"

class Base {
public:
  void A() { B(); }
  virtual void B() { cout << "Base"; }
}

class Descendant : public Base {
public:
  virtual void B() overriden { cout << "Desc"; }
}

main () {
  Descendant D;
  D.A();
}

这里一定有一些概念性的东西。 D.A() 是否应该导致 "Desc" 被打印?如果不是,为什么?

【问题讨论】:

  • can't reproduce 使用显示的确切代码(在修复其中的拼写错误之后)。调用D.A() 会按预期显示"Desc"。不会发生的唯一方法是 1) A()/B()Base 构造函数/析构函数的上下文中被调用,或者 2) 如果 Descendant::B() 实际上没有覆盖 Base::B() (是 override 关键字旨在在编译时捕获的内容)。在后一种情况下,请确保您在实际代码中实际使用了 override(在 C++11 之前的版本中,没有 override)。
  • 这是override,而不是overriden。这进一步巩固了此代码未经测试并且不会重现您的问题。请创建一个合适的minimal reproducible example
  • @Storyteller - 正如我在问题中所说,这不是要编译的代码,只是表达我的问题的一种方式。它不应该编译
  • @Remy - 在你的 cmets 我做了一些追逐之后,我意识到 A 实际上是构造函数。这就解释了为什么后代 B 从未被调用过。 (我花了一段时间才找到)。
  • @TSG 那么您应该将其发布为答案,或者直接关闭问题。

标签: c++ inheritance overriding


【解决方案1】:

问题中有一个重要错误。方法 A 实际上是 Base 类的构造函数。构造函数不能调用派生类的任何方法(甚至是虚拟方法)是有道理的,因为这些派生类还不存在。

当 A 是非 ctor 时,它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2018-12-24
    • 1970-01-01
    • 2021-09-02
    • 2011-01-20
    • 2017-10-31
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多