Como chamo a função pai de uma classe derivada usando C ++? Por exemplo, eu tenho uma classe chamada parent
e uma classe chamada child
derivada do pai. Dentro de cada classe há uma print
função. Na definição da função de impressão da criança, gostaria de fazer uma chamada para a função de impressão dos pais. Como eu faria isso?
c++
oop
inheritance
IaCoder
fonte
fonte
Respostas:
Eu correrei o risco de declarar o óbvio: você chama a função, se definida na classe base, está automaticamente disponível na classe derivada (a menos que seja
private
).Se houver uma função com a mesma assinatura na classe derivada, você pode desambiguá-la adicionando o nome da classe base seguido por dois pontos
base_class::foo(...)
. Observe que, diferentemente de Java e C #, o C ++ não possui uma palavra-chave para "a classe base" (super
oubase
), pois o C ++ suporta herança múltipla, o que pode levar à ambiguidade.Aliás, você não pode derivar diretamente da mesma classe duas vezes, pois não haverá como se referir a uma das classes base sobre a outra.
fonte
template<class A, class B> class C: public A, public B {};
pode chegar a dois tipos, sendo o mesmo por razões, dependendo de como o seu código é usado (que faz com que A e B sejam iguais), pode ser dois ou três camada de abstração de alguém que não está ciente do que você fez.using namespace std
.Dada a classe pai nomeada
Parent
e a classe filho nomeadaChild
, você pode fazer algo assim:Observe que
Parent
é o nome real da classe e não uma palavra-chave.fonte
foo()
Aqui é análogoprint()
ou é uma função separada? E você quer dizer usandoprivate
herança para ocultar detalhes herdado da base, e fornecerpublic
funções para coisas que você sombreamento que deseja expor?foo()
era análogo aprint()
. Deixe-me voltar a usarprint()
como acho que faria mais sentido nesse contexto. Digamos que alguém criou uma classe que executou algum conjunto de operações em um tipo de dados específico, expôs alguns acessadores e tinha umprint(obj&)
método. Eu preciso de uma nova classe que funcione,array-of-obj
mas todo o resto é o mesmo. A composição resulta em muitos códigos duplicados. Minimiza herança que, noprint(array-of-obj&)
circuito de chamadaprint(obj&)
, mas não querem clientes para chamarprint(obj&)
, porque não faz sentido para eles a fazê-loSe sua classe base é chamada
Base
e sua função é chamada,FooBar()
você pode chamá-la diretamente usandoBase::FooBar()
fonte
No MSVC, existe uma palavra-chave específica da Microsoft para isso: __super
MSDN: permite declarar explicitamente que você está chamando uma implementação de classe base para uma função que você está substituindo.
fonte
typdef
os pais como algo parecidosuper
.__super
; Eu mencionei aqui como uma sugestão alternativa. Os desenvolvedores devem conhecer seu compilador e entender os prós e os contras de seus recursos.Se o modificador de acesso da função de membro da classe base estiver protegido OU público, você poderá chamar a função de membro da classe base da classe derivada. É possível chamar a função de membro não virtual e virtual de classe base da função de membro derivada. Por favor, consulte o programa.
Resultado:
fonte
virtual
!Chame o método pai com o operador de resolução de escopo pai.
fonte
Exemplo de referência.
fonte