C ++对抽象父

时间:2017-09-28 15:06:42

标签: c++ inheritance copy-constructor

想象一下这些复制构造函数的孩子狗和动物猫:

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);

1 个答案:

答案 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);
}

Live Example