不能转换子类..到其私有基类

Cannot cast subclass ... to its private base class

本文关键字:基类 转换 子类 不能      更新时间:2023-10-16

我不知道如何解决以下错误

无法将 Cat 强制转换为其私有基类动物

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 catn");
          }
     }
}
int main() {
    AnimalQueue animalQ;
    Cat cat = Cat("kitty");
    animalQ.enqueue(cat); // ERROR
    return 0;
}

您可以使用 C 样式强制转换来执行此操作:

animalQ.enqueue( (Animal &)cat );

这是少数几种通过 C 型演员表合法但不能用 C++ 型演员表完成的情况之一。 有关更多信息,请参阅此处。

不过,对于基类来说,使用公共继承会是一个更好的设计;私有继承实际上没有有效的用例。

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

class Cat : public Animal {
这就是

问题所在,我必须将其公开

class Cat : public Animal