首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用继承类使用覆盖虚拟方法

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

Stack Overflow用户
提问于 2016-01-06 12:52:35
回答 1查看 65关注 0票数 0

问题

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

示例

代码语言:javascript
复制
#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;
  }
  */
};

我的主菜是这样的:

代码语言:javascript
复制
BaseClass().PressButton();
ChildClass().PressButton();

产出:

代码语言:javascript
复制
KABOOM
KABOOM

现在我知道了,如果我的子类不继承BigNuke,并且我取消了核子方法的注释,我就得到了我所期望的:

代码语言:javascript
复制
KABOOM
MASSIVE KABOOM

那么,当从另一个类继承时,我如何获得MASSIVE KABOOM呢?我认为BigNukeBaseClass继承的唯一方法是,但我不想这样做。在我的实际应用程序中,我有许多不同的基类和许多不同类型的大核弹,所有这些都可以混合和匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-06 13:11:20

你想做的是“不可能”。在C++中,它们不是“按名字链接”的东西。基本上,您的代码相当于:

代码语言:javascript
复制
class A {
public:
    void f () { g(); }
    virtual void g () { }
};

class B {
public:
    void h () ;
};

class C: public A, public B { };

您希望访问B::h in A,但是AB::h一无所知。将B::h更改为B::g不会改变任何事情,因为这些只是名称(在C++中没有动态绑定这样的东西)。

实现所需功能的一种方法是重写C::g并在其中调用B::h

代码语言:javascript
复制
class C {
public:
    virtual void g () { B::g(); }
};

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

代码语言:javascript
复制
template <typename T>
class _C: public A, public T {
public:
    virtual void g () { T::g(); }
};

class C: public _C <B> { };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34633659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档