Когда используется виртуальное наследование? - вопрос №3235915

Вопрос задан анонимно
02.04.19
1 ответ

Лучший ответ по мнению автора

Виртуальное наследование необходимо в такой ситуации.

<code><span class="kwd">class</span><span class="pln"> A </span><span class="pun">{</span><span class="typ">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pun">};</span></code><code><span class="kwd">class</span><span class="pln"> B</span><span class="pun">:</span><span class="kwd">public</span><span class="pln"> A </span><span class="pun">{};</span></code><code><span class="kwd">class</span><span class="pln"> C</span><span class="pun">:</span><span class="kwd">public</span><span class="pln"> A </span><span class="pun">{};</span></code><code><span class="kwd">class</span><span class="pln"> D</span><span class="pun">:</span><span class="kwd">public</span><span class="pln"> B</span><span class="pun">,</span></code><code><span class="kwd">public</span><span class="pln"> C </span><span class="pun">{};</span></code>

В классе D, в таком случае, будут два поля с именем a и они оба будут принадлежать классу A. Проблема состоит в определении к какой переменной идет обращение. Для исключения подобной ситуации используют виртуальное наследование. Правильный вид объявления в данном примере будет.

<code><span class="kwd">class</span><span class="pln"> A </span><span class="pun">{</span><span class="typ">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pun">};</span></code><code><span class="kwd">class</span><span class="pln"> B</span><span class="pun">:</span><span class="kwd">public </span><span class="kwd">virtual</span><span class="pln"> A </span><span class="pun">{};</span></code><code><span class="kwd">class</span><span class="pln"> C</span><span class="pun">:</span><span class="kwd">public </span><span class="kwd">virtual</span><span class="pln"> A </span><span class="pun">{};</span></code><code><span class="kwd">class</span><span class="pln"> D</span><span class="pun">:</span><span class="kwd">public</span><span class="pln"> B</span><span class="pun">,</span><span class="kwd">public</span><span class="pln"> C </span><span class="pun">{};</span></code>
02.04.19
Лучший ответ по мнению автора
Посмотреть всех экспертов из раздела Технологии > C/C++
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store