无法将子类...转换为其私有基类

时间:2014-12-21 22:50:11

标签: c++

我不确定如何解决以下错误

无法将Cat转换为其私有基类Animal

class Animal {
private:
    std::string name;
public:
    Animal(std::string n) {
        name = n;
    }
};

class Cat : Animal {
public:
    Cat(std::string n) : Animal(n) {}
};

class AnimalQueue {
private:
    std::list<Animal> cats;
    std::list<Animal> dogs;
public:
    void enqueue(Animal a) {
          if (typeid(a) == typeid(Cat)) {
                printf("I'm a cat\n");
          }
     }
}

int main() {
    AnimalQueue animalQ;
    Cat cat = Cat("kitty");
    animalQ.enqueue(cat); // ERROR
    return 0;
}

3 个答案:

答案 0 :(得分:3)

你可以用C风格的演员表来做到这一点:

animalQ.enqueue( (Animal &)cat );

这是少数情况下通过C风格演员表演合法但无法用C ++风格演员表演的情况之一。详情请见see here

虽然基类使用公共继承是更好的设计;私有继承实际上没有有效的用例。

答案 1 :(得分:2)

默认情况下,继承是私有的。您需要明确告诉编译器使用公共继承。因此,您需要使用以下命令声明您的类:

class Cat : public Animal {

答案 2 :(得分:1)

这是问题,我必须公开

class Cat : public Animal