c++ - 从子类调用父虚函数

标签 c++ class polymorphism

我想和两个“单位”进行一些“决斗”。 我编写了由两个“单元”构成的类“决斗”。 但是有些“单位”是特殊的(继承自单位),如英雄、老板等。他们想在战斗中使用特殊攻击。 但实际上“决斗”类并不知道谁是英雄,谁是纯单位。

代码如下所示:

#include <iostream>

class unit{
  public:
   unit(){};
   virtual void make_hit(){
     std::cout<<"pure hit\n";
   }
};

class hero:public unit {
  public:
   hero():unit(){};
   void  make_hit(){
     std::cout<<"SUPER hit\n";
   }
};

class duel {
  unit *a, *b;
  public:
  duel(unit _a, unit _b):a(&_a),b(&_b){};
  void start (){
    a->make_hit();
    b->make_hit();
  }
};

int main(){
  duel(unit(),hero()).start();
  return 0;

}

我有两个主要问题。

首先 - 我在构造函数中使用引用临时对象。当 duel::duel() 完成时,该对象是非法的。

其次 - 我的英雄变成了纯单位,并且不使用“ super 命中”

是否有可能以优雅的方式修复它(无需更改 main() 中的调用)?

最佳答案

由于切片,最好始终将多态与 智能指针。这将是一个可能的设计:

#include <iostream>
#include <memory>
#include <utility>

using namespace std;

class unit_base
{
public:
    virtual ~unit_base() = default;
    virtual void make_hit() =0;
};

class unit : public unit_base
{
public:
    unit() = default;
    virtual void make_hit() override
    {
        cout << "pure hit" << endl;
    }
};

class hero : public unit_base
{
public:
    hero() = default;
    virtual void make_hit() override
    {
        cout << "SUPER hit" << endl;
    }
};

class duel
{
public:
    duel( shared_ptr<unit_base> a, shared_ptr<unit_base> b )
        : a(a), b(b)
    {}
    void start()
    {
        auto aa = a.lock();
        auto bb = b.lock();
        if( aa && bb )
        {
            aa->make_hit();
            bb->make_hit();
        } else {
            cout << "duelist expired" << endl;
        }
    }
private:
    weak_ptr<unit_base> a, b;
};

int main()
{
    // use with temporarys
    duel{ make_shared<unit>(), make_shared<hero>() }.start();

    cout << "-------------" << endl;

    // use with variables
    auto u = make_shared<unit>();
    auto h = make_shared<hero>();
    duel d{h,u};
    d.start();

    cout << "-------------" << endl;

    // try to use with expired duelists
    u.reset();
    d.start();
}

还要记住在您的基类中始终有一个虚拟析构函数。

关于c++ - 从子类调用父虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487730/

相关文章:

c++ - OpenGL3.3 中的代码不在正交投影中渲染纹理

c++ - 基类有虚方法,子类有非虚方法。即使它是非虚拟的,仍然如何调用子类方法

ruby-on-rails-3 - 设置多态 has_many :through relationship

java - 单个对象如何为同一字段显示不同的值(继承)

c++ - 包含通过引用捕获的 lambda 函数的 "variable"的类型是什么?

c++ - 在 Xcode 和 Eclipse 中输出 char 数组

c++ - boost pool_allocator 内存池行为说明

Java 线程与对象

c# - 真正的拦截器对我的 C# 类做了什么?

javascript - Sencha Extjs - 正确覆盖方法吗?