我想使用继承的类覆盖虚拟方法。
#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
,但我不想这样做。在我的实际应用程序中,我有许多不同的基类和许多不同类型的大核武器,所有这些都可以混合和匹配。
答案 0 :(得分:0)
你想做的是&#34;不可能&#34;。他们在C ++中没有这样的东西,因为&#34;链接了名称&#34;。基本上,您的代码相当于:
class A {
public:
void f () { g(); }
virtual void g () { }
};
class B {
public:
void h () ;
};
class C: public A, public B { };
您想访问B::h
中的A
,但A
对B::h
一无所知。将B::h
更改为B::g
不会改变任何内容,因为这些只是名称(并且C ++中没有动态绑定)。
实现目标的一种方法是覆盖C::g
并在其中调用B::h
:
class C {
public:
virtual void g () { B::g(); }
};
如果您有许多类B
和C
,则可能需要使用模板:
template <typename T>
class _C: public A, public T {
public:
virtual void g () { T::g(); }
};
class C: public _C <B> { };