我有一个抽象类,其他3个类继承了它们,它们是具体的类。我有一个类型为抽象类的指针。我想编写一个函数,它接收我提到的3个类之一的对象,然后为它分配内存(使用基类指针),然后将传递对象的值赋给它。我如何new
记忆我的函数中的特殊类型?
(我不知道我收到的对象的类型。我只知道它继承自我的抽象类)
感谢。
答案 0 :(得分:1)
我解决这个问题的方法是我将一个duplicate()
方法添加到抽象基类中,我将在每个派生类中实现它。每个实现确切地知道它有多大,因此它可以使用new
来分配内存。它还确切地知道它具有什么内容,因此它可以将其值分配给新实例。不错,简单,优雅。和面向对象。
答案 1 :(得分:0)
您有两种选择。
可以使用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;
}
开箱即用的可复制类。如果你的课程不可复制,你可以自己覆盖clone
,并做有意义的事情。