我有以下问题:
这是一个例子(编译错误):
class Animal
{
public:
explicit Animal(void){;}
};
class Dog: private Animal
{
public:
explicit Dog(void){;}
};
int main(int argc, char *argv[])
{
Dog* pDog1 = new Dog();
Animal* pDog2 = new Dog();
return 0;
}
我该如何解决这个问题? 谢谢!
编辑:假设Base类是从某个库继承的,因此我无法改变它。
答案 0 :(得分:3)
希望将某些类继承为受保护的
然后理论上它应该是class Dog : protected Animal
。
现在,对于任何非public
无效,Base *p = new Derived;
无效;因为Base*
无法访问。没有reinterpret_cast<>
或C风格的演员阵容就无法完成。
我建议不要使用演员阵容。理想情况下,对于private/protected
继承,基本指针不应该在一般范围内保存派生指针。要解决您的问题:
public
继承Dog*
投射到的设计
Animal*
醇>
答案 1 :(得分:3)
作为reinterpret_cast的替代方法,您可以使用方法公开基类。如果有一天你决定使用组合而不是继承,它将不会破坏你的代码:
class Dog: private Animal
{
public:
explicit Dog() {}
Animal * GetAnimal() { return this; }
};
int main(int argc, char *argv[])
{
Dog* pDog1 = new Dog();
Animal * pDog2 = pDog1->GetAnimal();
return 0;
}
答案 2 :(得分:1)
要纠正编译错误,只需执行以下操作:
Animal* pDog2 = reinterpret_cast<Animal*>(new Dog());