问题
我希望使用继承的类覆盖虚拟方法。
示例
#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,并且我取消了核子方法的注释,我就得到了我所期望的:
KABOOM
MASSIVE KABOOM那么,当从另一个类继承时,我如何获得MASSIVE KABOOM呢?我认为BigNuke从BaseClass继承的唯一方法是,但我不想这样做。在我的实际应用程序中,我有许多不同的基类和许多不同类型的大核弹,所有这些都可以混合和匹配。
发布于 2016-01-06 13:11:20
你想做的是“不可能”。在C++中,它们不是“按名字链接”的东西。基本上,您的代码相当于:
class A {
public:
void f () { g(); }
virtual void g () { }
};
class B {
public:
void h () ;
};
class C: public A, public B { };您希望访问B::h in 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> { };https://stackoverflow.com/questions/34633659
复制相似问题