gpt4 book ai didi

c++ - 如何为一个我不知道其真实类型的对象分配内存? C++

转载 作者:行者123 更新时间:2023-11-27 22:29:43 25 4
gpt4 key购买 nike

我想将某个派生类的对象存储为另一个对象的属性。

我的问题是要知道要存储的对象的大小,因为它可以是给定基类的任何派生类。我不能只为基类的对象分配内存,对吧,因为它更小。我想,typeof 运算符也只会给出基类的大小,对吧?

这是我的示例代码。请查看评论以了解我的意思。请原谅我的非原创......

BaseA {};

DerivedA1 : BaseA {public: void property() { cout << 1; }};
DerivedA2 : BaseA {public: void property() { cout << 2; }};
// etc. - several derived classes.

BaseB // Contains (or links to) an instance of class derived from BaseA.
{
public:
BaseA * instanceA;

BaseB (BaseA instanceAX)
{
// ??? => How to allocate memory for the object
// I don't know the real type of?
instanceA = new BaseA (instanceAX);
}

BaseB (BaseA instanceAX) { delete instanceA; }
};

main()
{
DerivedA1 instanceA1;
BaseB instanceB (instanceA1);

// Use "property" regardless of which derived class it belongs to.
instanceB.instanceA->property();
}

我可以存储一个指针而不是对象本身,这样会更容易。但我不确定我是否希望依赖调用者在实例 instanceB 的生命周期内保留属性对象。

谢谢!

最佳答案

好吧,首先,由于您按值而不是按引用或指针传入 BaseA,因此您确实知道类型;这是基地A。 BaseB 被复制到 BaseA 中,然后 BaseA 拷贝被发送到函数。 InstanceAX 中不包含 BaseB 中的任何额外数据。这称为“切片”。

但是,要回答您的问题,您根本就不会这样做。如果要以这种方式工作,则需要在 BaseB 类中使用 clone() 函数。或者,您可以设计一个智能指针或其他可以为您克隆实例的对象。如果您在 comp.lang.c++ 上搜索我的名字和 clone(),您可能会看到我在那里进行的关于后一个想法的讨论。

克隆函数当然是一个返回当前对象拷贝的虚函数:

struct BaseA
{
virtual BaseA* clone() const = 0;
};

struct BaseB : BaseA
{
BaseB* clone() const { return new BaseB(*this); }
};

关于c++ - 如何为一个我不知道其真实类型的对象分配内存? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com