我不明白如何定义下面的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*
,因此构造函数正在指向自身?
答案 0 :(得分:4)
您正在执行direct initialisation。
表达式new Rabbit()
将返回Rabbit*
。然后,此Rabbit*
值会转换为Animal*
值,这是可能的,因为Animal
是Rabbit
的基类。然后将Animal*
值分配到goffy
变量。
答案 1 :(得分:1)
由于goffy
是一个指针,它与
Animal* goffy = new Rabbit();
答案 2 :(得分:0)
对象的指针可以使用复制构造函数进行复制,就像堆栈中的常用对象一样。 但是,这里发生了一些事情:
Deer
对象,返回指向其地址的指针Animal
对象
默认编译器,但不是创建精确的副本,而是
Deer
对象正在被切片,因为Animal
是它的基类。