这个指针构造函数是如何定义的?

时间:2017-05-03 04:42:39

标签: c++ pointers constructor

我不明白如何定义下面的Animal(Animal*)构造函数。代码编译并正确运行。

class Animal {
public:
    virtual ~Animal() {}
    virtual std::string specie() = 0;
    virtual std::string family() = 0;
};

class Rodent : public Animal {
public:
    std::string family() override { return "rodent"; }
};

class Rabbit : public Rodent {
public:
    std::string specie() override { return "rabbit"; }
};

int main() {
    Animal* goffy(new Rabbit());
}

new Rabbit()返回Rabbit*继承为Animal*,因此构造函数正在指向自身?

3 个答案:

答案 0 :(得分:4)

您正在执行direct initialisation

表达式new Rabbit()将返回Rabbit*。然后,此Rabbit*值会转换为Animal*值,这是可能的,因为AnimalRabbit的基类。然后将Animal*值分配到goffy变量。

答案 1 :(得分:1)

由于goffy是一个指针,它与

完全相同
Animal* goffy = new Rabbit();

答案 2 :(得分:0)

对象的指针可以使用复制构造函数进行复制,就像堆栈中的常用对象一样。 但是,这里发生了一些事情:

  • 首先在堆上创建一个Deer对象,返回指向其地址的指针
  • 使用由提供的复制构造函数创建Animal对象 默认编译器,但不是创建精确的副本,而是 Deer对象正在被切片,因为Animal是它的基类。