如何实现 abstact 类C++

How to implement an abstact class C++

本文关键字:abstact C++ 实现 何实现      更新时间:2023-10-16

>我有以下抽象类:

class  Weapon
{
  public:
    Weapon(std::string const &name) : _name(name) {}
    virtual void attack() const = 0;
    std::string const &getName() const;
  private:
    std::string const &_name;
};

一个简单的暗示

class Shadowmourn : public Weapon 
{
  public:
    ShadowMourn() : Weapon(std::string("Shadowmourn")) {}
    void attack() const override {}
}

我可以编译它,但是当我尝试打印我的 devired 类的名称时,我得到了一些奇怪的字符。

Weapon *w = new Shadowmourn();
std::cout << "got " << w->getName() << std::endl;
std::cout << "got " << w->getName().c_str() << std::endl;

两个输出都不是预期的。我得到了一些不可读的字符。那么我的武器类实现是否不好?

您调用未定义的行为是因为您存储了对std::string的引用,即使包含Weapon仍然存在,该也会被销毁,然后您尝试访问已销毁的std::string

奇怪的输出是在这种情况下可能发生的许多不可预测的事情之一。

解决方案是使您的代码更简单:不要存储std::string const&而是存储std::string const

class  Weapon
{
  public:
    Weapon(std::string const &name) : _name(name) {}
    virtual void attack() const = 0;
    std::string const &getName() const;
  private:
    std::string const _name;
};

您还需要一个虚拟析构函数,并且您可能希望摆脱数据成员的下划线约定。您可能只想按值返回getName以避免悬而未决的引用带来进一步的麻烦。当我们这样做时,具有虚函数的类总是删除复制构造函数和复制赋值运算符的良好候选者。

class  Weapon
{
  public:
    Weapon(std::string const &name) : name(name) {}
    virtual ~Weapon() = default;
    Weapon(Weapon const&) = delete;
    Weapon& operator=(Weapon const&) = delete;
    virtual void attack() const = 0;
    std::string getName() const;
  private:
    std::string const name;
};