2017-02-09 5 views
3

Если класс является производным от другого класса, какРеализация защищенного/частного наследования компилятор

class B{}; 
class D : private B{}; 

тогда я не могу создать производные объекты класса, как: -

B* ptr = new D; 

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

Может ли кто-нибудь объяснить, как и на какой стадии компилятор проводит различие между государственным/защищенным и частным наследством.

+1

Какой компилятор вы спрашиваете? Почему вы заботитесь о реализации конкретного компилятора, а не о семантике, предоставляемой вашему коду стандартом C++? – Mankarse

+1

Интересно: Вы правильно пишете, что не можете этого сделать. Но тогда вы пишете о сравнении кода ассемблера. Если он не компилирует, какой код ассемблера вы смотрите? – Rene

+0

@Rene, для сравнения кода сборки я вообще не создаю объект производного класса. Только компиляция кода, который имеет оба класса, определенные в файле. –

ответ

3

Компилятор проверяет защиту (публичный/частный) во внешнем интерфейсе при разборе кода. Как только он доберется до оптимизатора и генерации кода, они исчезли.

+0

Обычно. Но информация о том, что является частной и публичной, в какой-то форме, должна присутствовать в информации RTTI, так что 'dynamic_cast' может выйти из строя при попытке применить к чему-то непубличному. Кроме того, во время генерации кода компилятор должен гарантировать, что члены данных, объявленные с тем же уровнем доступа (первоначально на C++ 98 он был, в обложке того же экземпляра спецификатора доступа), помещаются строго возрастающими адресами. Таким образом, этот ответ отражает основную идею, но детали тернистые. ;-) –

+0

Ну, я должен позавтракать и т. Д. И сделать кое-что, поэтому я предлагаю вам просто изучить это, в том числе, попробовав примеры кода и добавив информацию. –

0

private означает: «Может быть доступен только внутри класса или друзей класса»

Частного наследство такого же, как общественное наследование; но существуют ограничения на код, который может получить доступ к тому факту, что D унаследован от B. Так как вы можете делать все то же самое с частным наследованием, как и с наследованием общего пользования (но только в ограниченной области), имеет смысл, что эти два реализованы одинаково.

Ваша претензия на то, что вы не можете создавать производные классы с B* ptr = new D;, верна только в том случае, если вы не в области D; например, это работает:

class B{}; 
class D : private B{ 
    public: 
    void makeB() { 
     B* ptr = new D; 
    } 
}; 
0

Компилятор просто разбирает язык и следит за тем, чтобы вы не нарушили правила.

Затем он продолжает выдавать некоторый машинный код (возможно, через язык ассемблера).

До тех пор, пока вы не нарушили правила C++, он может выполнять реализацию в машинный код.

Таким образом, на этом этапе частный/общественный/защищенный или что-то еще не имеет значения. Выше цепи, которую вы защитили

0

Компилятор проверяет доступ и дает ошибку компиляции, если базовый класс недоступен. Нет необходимости передавать другой код исполняемому файлу.

Бывают случаи, когда может испускаться другой код (например, использование RTTI, dynamic_cast и т. Д., Которые выполняют проверки типа времени выполнения), но вы не используете это в этом случае.

Кстати,

B* ptr = new D; 

может быть выполнена в виде функции, которая является членом или friend из D.

0

Вы ошибаетесь.Вы, конечно, может создавать объекты:

D* pd = new D; 

Вы не, однако, отливатьD объекта для базового типа B, из-за своей «частной» сферы.
Вы можете увидеть это, например, с помощью этого кода:

D d;    // created successfully 
B *pd = & d;  // forbidden 
B &pb = d;  // forbidden 

Сообщения очевидны:

'type cast' : conversion from 'D *' to 'B *' exists, but is inaccessible 
'type cast' : conversion from 'D *' to 'B &' exists, but is inaccessible 

, что означает объект D d существует и может рассматриваться как тип B, он просто невозможно получить доступ в этом контексте.

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

Смежные вопросы