【发布时间】: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