【发布时间】:2018-01-28 16:59:54
【问题描述】:
我有一个类A 和一个继承自A 的类B。 A 有一个 foo 方法,我想在 B 中覆盖它。
class A {
public:
void foo();
...
}
class B: public A {
public:
void foo();
...
}
解决方案当然是将A::foo() 定义为虚拟方法,将其声明为virtual void foo();。但问题是我不能这样做,因为A 类是在第三方库中定义的,所以我宁愿不更改它的代码。
经过一番搜索,我找到了override 关键字(因此B::foo 的声明将是void foo() override;),但这对我没有帮助,因为that's not what override is for,override 显然只能使用在虚拟方法上,以确保该方法确实覆盖了另一个方法并且程序员没有犯错,如果该方法不是虚拟的,则会生成错误。
我的问题是如何在不更改A 的任何代码而只更改B 的代码的情况下实现与使A::foo 虚拟化相同的效果?
【问题讨论】:
-
如果基类不是为支持虚拟调度而设计的,那么基本上你不能,不改变类 - 具体来说,它最好有一个虚拟析构函数。
-
简短的回答是:你不能。 C++ 不能以这种方式工作。
-
@NeilButterworth 我打算在
B::foo中添加A::foo();,以便B::foo调用A::foo以及我需要的其他一些东西,所以我想要do 不应该真正改变基类的行为方式。 -
@Donald 好吧,这听起来可行,但它不会覆盖任何东西。
-
“覆盖”意味着当您有一个指向基类型的指针或引用并调用基类的函数时,调用将转到派生类中定义的函数的版本。如果这是您想要做的,您必须将基类函数声明为
virtual。如果您想做其他事情,那么您并没有压倒一切,您需要说出您想做的事情。
标签: c++ inheritance methods overriding virtual-functions