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

how to allocate memory for specify type in polymorphism?

本文关键字:类型 分配 内存 多态性      更新时间:2023-10-16

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

谢谢。

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

有两个选项供您选择。

  1. 克隆派生类型的对象。
  2. 创建派生类型的默认构造对象。

它们都可以使用 virtual 成员函数实现。

您可以看到C++:深层复制基类指针,了解如何克隆对象。

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

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()

解决它的常用方法是添加一个每个类覆盖的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;
}

现场示例

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