classe base virtual
No processo de herança que aprendi antes, me pergunto se você pensou nesta situação: em um relacionamento de herança múltipla, se uma classe derivada herda de duas classes pai, e essas duas classes pai herdam de uma classe herdada da base aula. Isso seria problemático, porque você poderia herdar duas cópias do mesmo membro!
Isso leva ao chamado problema da ambiguidade .
Deixe-me primeiro dar um exemplo que ilustra esse tipo de herança múltipla! Pensei nisso e pensei neste exemplo: Era uma família rica. No início, havia dois filhos. O mestre era o responsável e guardava a chave da porta. poucos anos, eles cresceram e o mestre estava velho, então ele combinou mais duas chaves e as deu aos seus dois filhos respectivamente, e os deixou cuidar dos negócios da família. e havia um menino e uma menina, respectivamente, continuando a linhagem familiar. As chamadas pessoas são prósperas e depois cresceram, e é hora de entregar a chave. Nos tempos antigos, é claro que a chave era passada para o menino, então é claro que a chave era dada ao neto. desta vez.Nesta época, o pai do neto e seu tio (ou seja, os dois filhos do proprietário original) tiveram que dar uma chave ao neto, então ele tinha duas chaves. O neto olhou para as duas chaves em sua mão e disse: “Uma é o suficiente! Duas... isso não é um desperdício?”
Depois de ler esta história, será mais fácil para todos entenderem a herança. O protagonista masculino original da história, Vovô, é a classe base. Seus dois filhos são duas classes derivadas, e o filho de uma delas é o menor. Sun Tzu é a última classe derivada porque herda de duas classes derivadas. E essas duas classes derivadas possuem um membro comum (chave, pois ambas herdam a mesma classe base - vovô). A última classe derivada de Sun Tzu possui dois membros duplicados (chaves), o que é a fonte da ambiguidade!
Abaixo, seguimos este exemplo e escrevemos o código especificamente, você pode consultá-lo:
/************************************//Des: demonstração do tutorial C++//Autor: Huang/ /Direitos autorais:www.dotcpp.com//Data:2017/12/18********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ NetoA ;//A.key=9;return0;}
O código é uma manifestação da história de agora. Para conveniência da descrição, as quatro classes definidas estão vazias. Ou seja, a classe Grandson herda duas classes pai e terá dois membros-chave. Se você tentar usar esta chave neste momento, observe que ela foi declarada como um tipo público ao tentar atribuir um valor na função principal. , haverá uma mensagem de erro "não único, ambíguo" , ou seja, ocorre o chamado problema de ambiguidade e todos podem entendê-lo bem.
Então, como evitar esse problema? É quando você precisa usar classes base virtuais ! A chamada classe base virtual deve modificá-la com virtual antes de herdar o tipo público ao herdar. Por exemplo, neste exemplo, a classe pai só precisa adicionar um virtual extra ao herdar a classe avô. classe e a classe base manterão apenas uma cópia de um objeto de classe base. Evite múltiplas cópias e ambigüidades.
O método de definição consiste em adicionar uma declaração virtual ao derivar as duas classes pai:
classFather1:virtualpublicAvôclassFather2:virtualpublicAvô
O resto permanece inalterado. Você pode testá-lo em seu próprio computador para entender a geração de ambigüidade e o uso de classes base virtuais.