如何为多态中的指定类型分配内存?

时间:2017-05-09 17:59:47

标签: c++ class inheritance polymorphism

我有一个抽象类,其他3个类继承了它们,它们是具体的类。我有一个类型为抽象类的指针。我想编写一个函数,它接收我提到的3个类之一的对象,然后为它分配内存(使用基类指针),然后将传递对象的值赋给它。我如何new记忆我的函数中的特殊类型? (我不知道我收到的对象的类型。我只知道它继承自我的抽象类)

感谢。

3 个答案:

答案 0 :(得分:1)

我解决这个问题的方法是我将一个duplicate()方法添加到抽象基类中,我将在每个派生类中实现它。每个实现确切地知道它有多大,因此它可以使用new来分配内存。它还确切地知道它具有什么内容,因此它可以将其值分配给新实例。不错,简单,优雅。和面向对象。

答案 1 :(得分:0)

您有两种选择。

  1. 克隆派生类型的对象。
  2. 创建派生类型的默认构造对象。
  3. 可以使用virtual成员函数来实现它们。

    您可以看到有关如何克隆对象的C++: Deep copying a Base class pointer

    您可以按照类似的路径返回默认构造的对象。

    struct base {
       virtual ~base() {}                // Remember to provide a virtual destructor
       virtual base* make_new() const = 0;
    };
    struct derived : base {
       virtual derived* make_new() const {
          return new derived(); // Return a default-constructed object.
       }
    };
    

    添加然后在指针上调用make_new()

答案 2 :(得分:0)

解决它的常用方法是添加每个类重写的clone成员函数。然而,这可能有点像锅炉板,所以如果你不怕模板,你可以自动化这个过程:

#include <iostream>
#include <memory>

struct Abstract {
    virtual ~Abstract() = default;
    virtual std::unique_ptr<Abstract> clone() const = 0;
    virtual void                      speak() const = 0;
};

template<class C>
struct Cloneable : Abstract {
        std::unique_ptr<Abstract> clone() const override {
            return std::make_unique<C>(*(C*)this);
        }
};

struct Concrete : Cloneable<Concrete> {
    void speak() const override {
        std::cout << "Concrete";
    }
};

void foo(Abstract& a) {
    a.clone()->speak();
}

int main() {
    Concrete c;
    foo(c);
    return 0;
}

Live Example

开箱即用的可复制类。如果你的课程不可复制,你可以自己覆盖clone,并做有意义的事情。