作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将某个派生类的对象存储为另一个对象的属性。
我的问题是要知道要存储的对象的大小,因为它可以是给定基类的任何派生类。我不能只为基类的对象分配内存,对吧,因为它更小。我想,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/
我是一名优秀的程序员,十分优秀!