clase base virtual
En el proceso de herencia que aprendí antes, me pregunto si ha pensado en esta situación: en una relación de herencia múltiple, si una clase derivada hereda de dos clases principales, y estas dos clases principales heredan de una. clase. ¡Eso sería problemático porque podrías heredar dos copias del mismo miembro!
Esto lleva al llamado problema de la ambigüedad . ¡Empecemos a estudiar!
¡Primero permítanme darles un ejemplo que ilustra este tipo de herencia múltiple! Lo pensé y se me ocurrió este ejemplo: Solía haber una familia rica. Al principio, había dos hijos. El maestro estaba a cargo y guardaba la llave de la puerta. Después de unos años, crecieron y el amo era mayor, así que emparejó dos llaves más y se las dio a sus dos hijos respectivamente, y les dejó hacerse cargo del negocio familiar. Después de muchos años, los dos hijos también se casaron. y había un niño y una niña respectivamente, nietos, continuando la línea familiar. Las supuestas personas son prósperas y luego han crecido y es hora de entregar la llave. En la antigüedad, la llave, por supuesto, se pasaba al niño, por lo que, por supuesto, la llave se le entregaba al nieto. En este momento, el padre del nieto y su tío (es decir, los dos hijos del dueño original) tuvieron que darle al nieto una llave, por lo que tenía dos llaves. El nieto miró las dos llaves que tenía en la mano y dijo: "¡Una es suficiente! Dos... ¿no es esto un desperdicio?"
Después de leer esta historia, será más fácil para todos entender la herencia. El protagonista masculino original de la historia, el abuelo, es la clase base. Sus dos hijos son dos clases derivadas, y el hijo de una de ellas es el pequeño. Sun Tzu es la última clase derivada porque hereda de dos clases derivadas. Y estas dos clases derivadas tienen un miembro común (clave, porque ambas heredan la misma clase base: abuelo). La última clase derivada de Sun Tzu tiene dos miembros duplicados (claves), ¡lo cual es la fuente de ambigüedad!
A continuación, seguimos este ejemplo y escribimos el código específicamente, puede consultarlo:
/************************************//Des: Demostración del tutorial de C++//Autor: Huang/ /Copyright:www.dotcpp.com//Fecha:2017/12/18********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ NietoA ;//A.key=9;return0;}
El código es una manifestación de la historia de ahora. Para facilitar la descripción, las cuatro clases definidas están vacías. Solo concéntrese en la relación de herencia. Es decir, la clase Grandson hereda dos clases principales y tendrá dos miembros clave. Si intenta utilizar esta clave en este momento, tenga en cuenta que se ha declarado como un tipo público al intentar asignar un valor en la función principal. Aparecerá un mensaje de error "no único, ambiguo", es decir, se produce el llamado problema de ambigüedad y todos pueden entenderlo bien.
Entonces, ¿cómo evitar este problema? ¡Aquí es cuando necesitas usar clases base virtuales ! La llamada clase base virtual consiste en modificarla con virtual antes de heredar el tipo público. Por ejemplo, en este ejemplo, la clase principal solo necesita agregar un virtual adicional al heredar la clase derivada. La clase y la clase base solo mantendrán una copia de un objeto de clase base. Evite copias múltiples y ambigüedades.
El método de definición consiste en agregar una declaración virtual al derivar las dos clases principales:
clasePadre1:virtualpublicAbueloclasePadre2:virtualpublicAbuelo
El resto permanece sin cambios. Puede probarlo en su propia computadora para comprender la generación de ambigüedad y el uso de clases base virtuales.