我不确定如何解决以下错误
无法将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;
}
答案 0 :(得分:3)
你可以用C风格的演员表来做到这一点:
animalQ.enqueue( (Animal &)cat );
这是少数情况下通过C风格演员表演合法但无法用C ++风格演员表演的情况之一。详情请见see here。
虽然基类使用公共继承是更好的设计;私有继承实际上没有有效的用例。
答案 1 :(得分:2)
默认情况下,继承是私有的。您需要明确告诉编译器使用公共继承。因此,您需要使用以下命令声明您的类:
class Cat : public Animal {
答案 2 :(得分:1)
这是问题,我必须公开
class Cat : public Animal