Ответ 1
Вы можете делать то, что хотите, но вам нужно отложить определение вложенных классов.
class Animal
{
class Bear;
class Giraffe;
};
class Animal::Bear : public Animal {};
class Animal::Giraffe : public Animal {};
Я пытаюсь сделать следующее:
class Animal
{
class Bear : public Animal
{
// …
};
class Giraffe : public Animal
{
// …
};
};
... но мой компилятор, похоже, задыхается от этого. Является ли это законным С++, а если нет, есть ли лучший способ сделать то же самое? По сути, я хочу создать более чистую схему именования классов. (Я не хочу выводить Animal
и внутренние классы из общего базового класса)
Вы можете делать то, что хотите, но вам нужно отложить определение вложенных классов.
class Animal
{
class Bear;
class Giraffe;
};
class Animal::Bear : public Animal {};
class Animal::Giraffe : public Animal {};
Тип класса считается неполным до тех пор, пока не будет достигнут конец его определения. Вы не можете наследовать из неполного класса, чтобы вы не могли наследовать из окружающего класса.
EDIT: Коррекция
Поскольку Ричард Волк исправил меня: можно унаследовать от вмещающего класса, если вы задерживаете определение вложенных классов. Подробнее см. Его ответ.
Не отвечает на вопрос, но я думаю, что вы злоупотребляете вложенным классом, может быть, вам стоит взглянуть на пространства имен (кстати, ответ "это невозможно, потому что Animal является неполным типом" ).
Я не понимаю, чего вы пытаетесь достичь здесь, но вы можете получить его через пространства имен.
namespace creatures
{
class Animal
{
};
class Bear : public Animal
{
};
class Giraffe : public Animal
{
};
}
Это объявляет Медведя и Жирафа как типы животных, но все это помещает в пространство имен, если вы ищете базовый класс, чтобы не загрязнять глобальное пространство имен.
Всегда стоит рассмотреть метод ATL "Наверху вниз". У меня болит голова каждый раз, когда мне это нужно, но эффективность объектного кода, который вы получаете, непревзойденна. Где-то я обрезал статью Джима Бевериджа, которая была лучшим объяснением, которое я когда-либо видел, но этого трудно найти сегодня, я просто вижу ссылку на него.
"25 марта 2004 г. Отличная статья от Джима Бевериджа: ATL и Upside-Down Inheritance.."