Частное наследство и конструкторы - PullRequest
1 голос
/ 19 августа 2011

У меня следующая проблема:

  • хочу наследовать некоторый класс как защищенный (вне производного класса мне не нужен какой-либо член или функция из базового класса)
  • хочу иметь возможность каким-то образом получить доступ к базовому конструктору

Вот пример (ошибка компиляции):

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;
}

Как я могу решить это? Спасибо!

edit: Допустим, базовый класс унаследован от некоторой библиотеки, поэтому я не могу его изменить.

Ответы [ 3 ]

3 голосов
/ 19 августа 2011

хочет наследовать некоторый класс как защищенный

Тогда теоретически это должно быть, class Dog : protected Animal.

Теперь для любого не public наследования Base *p = new Derived; недействительно; как Base* становится недоступным. Без reinterpret_cast<> или в стиле C это невозможно.

Я предлагаю не использовать слепки. В идеале для наследования private/protected базовый указатель не должен содержать производный указатель в общем объеме. Чтобы решить вашу проблему:

  1. Либо сделать наследство public
  2. Изменить дизайн, где приведение от Dog* к Animal* не нужно
3 голосов
/ 19 августа 2011

В качестве альтернативы 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;
}
1 голос
/ 19 августа 2011

Чтобы исправить ошибку компилятора, просто выполните:

Animal* pDog2 = reinterpret_cast<Animal*>(new Dog());
...