Защищенное / частное наследование - PullRequest
5 голосов
/ 21 марта 2011

Я столкнулся с этой проблемой случайно, когда перебирал наследование и приведение вверх / вниз.Почему это не разрешено (код прокомментирован, чтобы показать разделы, которые не разрешены)?Теперь я могу догадаться, почему это не разрешено, но фактический ответ был бы великолепен.

Что касается кода, который разрешен , я знаю, что это потому, что (Base *) - это приведение в стиле C, которое по сути является reinterpret_cast в C ++, что, в свою очередь, означает, что в этом случае это приведет к неопределенному поведению.Пожалуйста, поправьте меня, если я ошибаюсь.

class Base
{
};

class Derived : public Base
{
};

class DerivedProt : protected Base
{
};

class DerivedPriv : private Base
{
};

int main()
{
  Base* a = new Derived();
  Base* b = new DerivedProt();  // Not allowed
  Base* c = new DerivedPriv();  // Not allowed

  Base* d = (Base*) new DerivedProt(); // Allowed but undefined behavior...?
  Base* e = (Base*) new DerivedPriv(); // Allowed but undefined behavior...?
}

Ответы [ 2 ]

6 голосов
/ 21 марта 2011

Стандарт прямо указывает, что преобразования в стиле C могут выполнять это преобразование.Это единственное приведение, которое может выполнять приведение в стиле C , но не может выполнять приведение C ++.Результаты не являются неопределенными, насколько я знаю;это просто запрещено другим актерам.

1 голос
/ 21 марта 2011

Похоже, вы правы.

Следует помнить, что традиционные принципы ОО, такие как LSP, описывают только публичное наследование. Непубличное наследование находится между наследованием и композицией, базовый подобъект не является общедоступным, как композиция, но вы также можете воспользоваться функциями, основанными на наследовании, такими как виртуальные функции.

Однако, подобно составному подобъекту, только класс (или его потомки, в случае защищенного наследования) может получить адрес подобъекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...