如何使用继承类覆盖虚方法

时间:2016-01-06 12:52:35

标签: c++ inheritance

问题

我想使用继承的类覆盖虚拟方法。

实施例

#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,但我不想这样做。在我的实际应用程序中,我有许多不同的基类和许多不同类型的大核武器,所有这些都可以混合和匹配。

1 个答案:

答案 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,但AB::h一无所知。将B::h更改为B::g不会改变任何内容,因为这些只是名称(并且C ++中没有动态绑定)。

实现目标的一种方法是覆盖C::g并在其中调用B::h

class C {
public:
    virtual void g () { B::g(); }
};

如果您有许多类BC,则可能需要使用模板:

template <typename T>
class _C: public A, public T {
public:
    virtual void g () { T::g(); }
};

class C: public _C <B> { };