Подтвердить что ты не робот

Может ли вложенный класс С++ наследовать свой охватывающий класс?

Я пытаюсь сделать следующее:

class Animal
{
    class Bear : public Animal
    {
        // …
    };

    class Giraffe : public Animal
    {
        // …
    };
};

... но мой компилятор, похоже, задыхается от этого. Является ли это законным С++, а если нет, есть ли лучший способ сделать то же самое? По сути, я хочу создать более чистую схему именования классов. (Я не хочу выводить Animal и внутренние классы из общего базового класса)

4b9b3361

Ответ 1

Вы можете делать то, что хотите, но вам нужно отложить определение вложенных классов.

class Animal
{
   class Bear;
   class Giraffe;
};

class Animal::Bear : public Animal {};

class Animal::Giraffe : public Animal {};

Ответ 2

Тип класса считается неполным до тех пор, пока не будет достигнут конец его определения. Вы не можете наследовать из неполного класса, чтобы вы не могли наследовать из окружающего класса.

EDIT: Коррекция
Поскольку Ричард Волк исправил меня: можно унаследовать от вмещающего класса, если вы задерживаете определение вложенных классов. Подробнее см. Его ответ.

Ответ 3

Не отвечает на вопрос, но я думаю, что вы злоупотребляете вложенным классом, может быть, вам стоит взглянуть на пространства имен (кстати, ответ "это невозможно, потому что Animal является неполным типом" ).

Ответ 4

Я не понимаю, чего вы пытаетесь достичь здесь, но вы можете получить его через пространства имен.

namespace creatures
{

class Animal
{
};

class Bear : public Animal
{
};

class Giraffe : public Animal
{
};


}

Это объявляет Медведя и Жирафа как типы животных, но все это помещает в пространство имен, если вы ищете базовый класс, чтобы не загрязнять глобальное пространство имен.

Ответ 5

Всегда стоит рассмотреть метод ATL "Наверху вниз". У меня болит голова каждый раз, когда мне это нужно, но эффективность объектного кода, который вы получаете, непревзойденна. Где-то я обрезал статью Джима Бевериджа, которая была лучшим объяснением, которое я когда-либо видел, но этого трудно найти сегодня, я просто вижу ссылку на него.

"25 марта 2004 г. Отличная статья от Джима Бевериджа: ATL и Upside-Down Inheritance.."