私有继承和构造函数

时间:2011-08-19 03:00:58

标签: c++ inheritance constructor visibility

我有以下问题:

  • 想要继承一些受保护的类(外部派生类,我不需要基类中的任何成员或函数)
  • 希望能够以某种方式访问​​基础构造函数

这是一个例子(编译错误):

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类是从某个库继承的,因此我无法改变它。

3 个答案:

答案 0 :(得分:3)

  

希望将某些类继承为受保护的

然后理论上它应该是class Dog : protected Animal

现在,对于任何非public无效,Base *p = new Derived;无效;因为Base*无法访问。没有reinterpret_cast<>或C风格的演员阵容就无法完成。

我建议不要使用演员阵容。理想情况下,对于private/protected继承,基本指针不应该在一般范围内保存派生指针。要解决您的问题:

  1. 要么public继承
  2. 更改从Dog*投射到的设计
  3. 不需要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());