假设我有一个数据容器的基类:
class BaseClass{
public:
int a;
int getA();
void setA(int newA);
}
我有一个派生类:
class DerivedClass : BaseClass{
public:
int b;
int getB();
void setB(int newB);
}
现在我创建派生类的两个实例:
DerivedClass* first = new DerivedClass();
DerivedClass* second = new DerivedClass();
好的,这是我的问题: 如何让 second 指向第一个对象的深层副本(不会产生内存泄漏)?
另外,我必须考虑处理两个指针并想要复制它们的类/函数不知道确切的继承类。所以这些指针也可以指向 BaseClass 的另一个继承,并且复制函数必须仍然工作并复制 all!成员。
答案 0 :(得分:2)
此代码:
derivedClass x = *new derivedClass();
derivedClass y = *new derivedClass();
是一种令人费解的说法:
derivedClass x = derivedClass();
derivedClass y = derivedClass();
将new
放在那里只会造成内存泄漏,并且不会使x
或y
有任何不同,并且不会像你想象的那样使它们成为“指针”。至于:
*b = *a;
要正常工作,您应该使用虚拟功能:
class Derived {
public:
virtual void copy_to( Base &b ) const override
{
if( Derived *d = dynamic_cast<Derived*>( &b ) )
*d = *this;
}
并将其称为:
a->copy_to( *b );
当然copy_to
需要在基类和每个派生类中定义和实现。