复制多态对象

时间:2017-09-21 12:17:00

标签: c++ oop polymorphism

我有一个关于复制多态对象的问题。我的出发点是如何实现克隆函数的常用示例:

#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

1 个答案:

答案 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)时,请明确指定类型。