我有一个关于复制多态对象的问题。我的出发点是如何实现克隆函数的常用示例:
#include <iostream>
class Base
{
protected:
int a;
public:
void set_a(int x) { a = x; }
void get_a() { std::cout << a << "\n"; }
virtual ~Base() {}
virtual Base *clone() const = 0;
};
class Derived : public Base
{
public:
virtual Derived *clone() const
{
return new Derived(*this);
}
};
int main(int argc, char *argv[])
{
Base *ptr = new Derived;
ptr->set_a(20);
ptr->get_a();
Base *cpy = ptr->clone();
cpy->get_a();
}
为什么行new Derived(*this)
会导致this
的复制?是因为我们将Derived
的复制构造函数称为this
作为参数吗?
如果我们确实在调用Derived
的复制构造函数,那么为什么不进行以下编译:
Base *b = new Derived(ptr); //does not compile
答案 0 :(得分:4)
是因为我们调用了
Derived
的复制构造函数吗?
绝对。 *this
内的Derived::clone
表达式的类型为Derived&
,因此调用Derived::Derived(const Derived& original)
复制构造函数。
为什么不进行以下编译:
Base *b = new Derived(ptr);
此调用无法编译,因为ptr
是指针,而不是引用。这将编译,但在克隆的背景下将毫无意义:
Base *b = new Derived(*ptr);
克隆的重点是你不知道你得到的结果是什么类型;当您执行new Derived(*ptr)
时,请明确指定类型。