виртуальный базовый класс
Мне интересно, задумывались ли вы об этой ситуации в процессе наследования, который я изучал ранее: в отношениях множественного наследования, если производный класс наследуется от двух родительских классов, и эти два родительских класса наследуются от одного, унаследованного от базового. сорт. Это было бы проблематично, потому что вы можете унаследовать две копии одного и того же члена!
Это приводит к так называемой проблеме неоднозначности . Приступим к изучению!
Позвольте мне сначала привести пример, иллюстрирующий этот вид множественного наследования! Я подумал об этом и придумал такой пример: Жила-была богатая семья. Сначала у них было два сына, хозяин-мужчина был главным и хранил ключ от двери. Позже у них родилось два сына. Через несколько лет они выросли, и хозяин-мужчина состарился, поэтому он подобрал еще два ключа и дал их двум своим сыновьям, и позволил им взять на себя управление семейным бизнесом. Спустя много лет оба сына тоже поженились. и были внуки соответственно мальчик и девочка, продолжавшие семейную линию. Так называемые люди зажиточные, а потом они выросли, и пришло время передать ключ. В древние времена ключ, конечно, передавали мальчику, поэтому, конечно, ключ отдавался внуку. На этот раз отец внука и его дядя (то есть два сына первоначального владельца) должны были дать внуку ключ, поэтому у него было два ключа. Маленький внук посмотрел на два ключа в своей руке и сказал: «Одного достаточно! Два… разве это не пустая трата?»
Прочитав эту историю, каждому будет легче понять наследование. Первоначальный главный герой этой истории, дедушка, — это базовый класс. Двое его детей — это два производных класса, и ребенок одного из них — самый маленький. Сунь Цзы — последний производный класс, поскольку он наследует два производных класса. И у этих двух производных классов есть общий член (ключевой, поскольку они оба наследуют один и тот же базовый класс — дедушка). Последний производный класс Сунь Цзы имеет два повторяющихся члена (ключа), что является источником неоднозначности!
Ниже мы следуем этому примеру и пишем конкретно код, вы можете обратиться к нему:
/************************************//Des: Демо-учебник по C++//Автор: Хуанг/ /Авторские права:www.dotcpp.com//Дата:2017/12/18********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ ВнукА ;//A.key=9;return0;}
Код является проявлением только что произошедшей истории. Для удобства описания четыре определенных класса пусты. Просто сосредоточьтесь на отношениях наследования. То есть класс Grandson наследует два родительских класса и будет иметь два ключевых члена. Если вы попытаетесь использовать этот ключ в данный момент, обратите внимание, что он объявлен как открытый тип при попытке присвоить значение в основной функции. , появится сообщение об ошибке «не уникально, неоднозначно», то есть возникает так называемая проблема двусмысленности, и каждый может это хорошо понять.
Так как же избежать этой проблемы? Вот тогда вам и нужно использовать виртуальные базовые классы ! Так называемый виртуальный базовый класс должен модифицировать его с помощью виртуального перед наследованием открытого типа при наследовании. Например, в этом примере родительскому классу нужно добавить только дополнительный виртуальный класс при наследовании родительского класса. class, а базовый класс будет поддерживать только копию объекта базового класса. Избегайте множественных копий и двусмысленностей.
Метод определения заключается в добавлении виртуального объявления при наследовании двух родительских классов:
classFather1: virtualpublicGrandfatherclassFather2: virtualpublicGrandfather
Остальное остается неизменным. Вы можете протестировать его на своем компьютере, чтобы понять возникновение неоднозначности и использование виртуальных базовых классов.