新类型(抽象类)

Posted

技术标签:

【中文标题】新类型(抽象类)【英文标题】:new typeof(abstract class) 【发布时间】:2018-01-27 20:49:06 【问题描述】:

我有抽象类 Item 和 Item 的一些子多态类,例如:SwordAxe 等。

是否可以在 c++ 中执行以下操作:

Item* firstVariable = new Sword();
Item* secondVariable = new typeof(firstVariable);

当我这样做时,我得到一个错误,即 Item 是一个抽象类。 你知道如何解决这个问题吗?

【问题讨论】:

实现虚拟克隆功能。而且很难看出你是如何得到你所说的错误的,因为 C++ 没有 typeof 运算符。 @NeilButterworth typeof 是早于decltype 的 gcc 语言扩展,也适用于 C 模式。如果没有给出“-std=”(或“-ansi”)参数,则它可用。 【参考方案1】:

为了解释 Neil 的评论,下面是基本的克隆成语或虚拟复制成语的样子:

class Item 
public:
    virtual ~Item() = 0;
    virtual Item* clone() const = 0;
protected:
    Item(const Item&) = default;
    Item(Item&&) = default;
    Item& operator=(const Item&) = default;
    Item& operator=(Item&&) = default;
;

Item::~Item() = default;

class Sword : public Item 
public:
    virtual Item* clone() const override
     return new Sword(*this); 
;

class Axe : public Item 
public:
    virtual Item* clone() const override
     return new Axe(*this); 
;

int main()

    Item* firstVariable = new Sword();
    Item* secondVariable = firstVariable->clone();
    delete firstVariable;
    delete secondVariable;

但是,我建议几乎不要使用newdelete,因为它们很容易犯错误,导致指针悬空、重复删除、内存泄漏、异常不友好的代码等等。这是一个更安全的解决方案:

#include <memory>

class Item 
public:
    virtual ~Item() = 0;
    virtual std::unique_ptr<Item> clone() const = 0;
protected:
    Item(const Item&) = default;
    Item(Item&&) = default;
    Item& operator=(const Item&) = default;
    Item& operator=(Item&&) = default;
;

Item::~Item() = default;

class Sword : public Item 
public:
    virtual std::unique_ptr<Item> clone() const override
     return std::make_unique<Sword>(*this); 
;

class Axe: public Item 
public:
    virtual std::unique_ptr<Item> clone() const override
     return std::make_unique<Axe>(*this); 
;

int main()

    std::unique_ptr<Item> firstVariable = std::make_unique<Sword>();
    std::unique_ptr<Item> secondVariable = firstVariable->clone();

【讨论】:

以上是关于新类型(抽象类)的主要内容,如果未能解决你的问题,请参考以下文章

关于java抽象方法

Java 抽象类

数据抽象和封装的理解

接口和抽象类的区别

java新学者

C# 复习总结类继承和接口