【发布时间】:2016-01-06 12:52:35
【问题描述】:
问题
我想使用继承的类覆盖虚拟方法。
示例
#include <iostream>
class BaseClass
{
public:
void PressButton()
{
Nuke();
}
virtual void Nuke()
{
std::cout << "KABOOM" << std::endl;
}
};
class BigNuke
{
public:
void Nuke()
{
std::cout << "MASSIVE KABOOM" << std::endl;
}
};
class ChildClass : public BaseClass, public BigNuke
{
public:
/*
void Nuke()
{
std::cout << "MASSIVE KABOOM" << std::endl;
}
*/
};
我的主要看起来像这样:
BaseClass().PressButton();
ChildClass().PressButton();
输出:
KABOOM
KABOOM
现在我知道如果我的子类不继承自 BigNuke 并且我取消注释掉那个 nuke 方法,我得到了我所期望的:
KABOOM
MASSIVE KABOOM
那么当从另一个类继承时,我如何获得MASSIVE KABOOM 呢?我看到它的唯一方法是BigNuke 从BaseClass 继承,但我不想要这个。在我的实际应用程序中,我有许多不同的基类和许多不同类型的大核弹,所有这些都可以混合和匹配。
【问题讨论】:
-
详细说明,为什么不赞成?这是一个完整的例子
-
你为什么期望
BigNuke::Nuke()被调用,除非你真的决定在ChildClass中的一个被覆盖的函数中这样做? -
是的,我也不明白反对票。
-
你不能这样做,除非你将
BigNuke设为BaseClass的子类,因为BigNuke和BaseClass不相关,它们在BigNuke::Nuke之间没有联系和BaseClass::Nuke。唯一的方法是在ChildClass::Nuke中调用BigNuke::Nuke。 -
如果您使用 CRTP 定义调用多态函数的基类,即使通过不同的路径继承,它们也可以轻松调用正确的基类。或者,CRTP 可用于覆盖虚拟函数(以调用继承的版本),其总源代码少于在单个子类中这样做。
标签: c++ inheritance