如何为多态性中的指定类型分配内存
how to allocate memory for specify type in polymorphism?
我有一个抽象类,其他 3 个类从中继承,它们是具体的类。我有一个抽象类类型的指针。我想编写一个函数,它接收我提到的 3 个类之一的对象,然后为其分配内存(使用基类指针(,然后将传递对象的值分配给它。如何在函数中new
该特殊类型的内存?(我不知道我收到的对象的类型。我只知道它继承自我的抽象类(
谢谢。
我解决这个问题的方法是,我将向抽象基类添加一个duplicate()
方法,并在每个派生类中实现它。 每个实现都确切地知道它有多大,因此它可以使用 new
来分配内存。 它还确切地知道它拥有哪些内容,因此它可以将其值分配给新实例。 漂亮,简单,优雅。和面向对象。
有两个选项供您选择。
- 克隆派生类型的对象。
- 创建派生类型的默认构造对象。
它们都可以使用 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
,做有意义的事情。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 将超出范围的整数分配给有符号字符类型
- C++将一个指针分配给另一个指针时执行的类型检查
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 c++ 中将一种结构类型分配给另一种类型
- 将返回的类型分配给一个脱口机类型
- 如何为多态性中的指定类型分配内存
- malloc - 运行时内存指针类型分配
- 不能将Const数据类型分配到非Const数据类中
- C++ 随机将枚举类型分配给变量
- 游戏实体类型分配
- 在单个语句中将类类型分配给该类的取消引用指针时执行哪些操作
- C++如何将数据类型分配给二进制序列
- 为类型分配唯一的整型标识符,编译时