想象一下这些复制构造函数的孩子狗和动物猫:
class Animal
{
public:
Animal(??? other);
}
class Dog : Animal
{
public:
Dog(Dog& other);
}
class Cat : Animal
{
public:
Cat(Cat& other);
}
我必须为父Animal类中的???
编写什么才能允许以下构造函数:
Cat cat(otherCat);
Dog dog(otherDog);
但与Animal&
:
Cat cat(otherDog);
Dog dog(otherCat);
答案 0 :(得分:4)
您只需在Animal&
的复制构造函数中使用const Animal&
/ Animal
。这样做不会使Cat cat(otherDog);
工作,因为只考虑了Cat
的复制构造函数。如果取消注释Dog dog(cat);
,则以下代码将无法编译。
class Animal
{
public:
Animal(const Animal& other) {}
Animal() {}
};
class Dog : Animal
{
public:
Dog(const Dog& other) : Animal(other) {}
Dog() {}
};
class Cat : Animal
{
public:
Cat(const Cat& other) : Animal(other) {}
Cat() {}
};
int main()
{
Cat cat;
Cat other(cat);
//Dog dog(cat);
}