una programacion polimorfismo orientada objetos miembros hijo herencia ejemplos derivadas derivada codigo clases clase c++ oop inheritance

c++ - programacion - ¿Cómo llamar a una función de clase padre de la función de clase derivada?



miembros de una clase en programacion orientada a objetos (6)

Dado que la clase padre se llama Parent y la clase hijo se llama Child , puedes hacer algo como esto:

class Parent { public: void print(int x); } class Child : public Parent { void print(int x) override; } void Parent::print(int x) { // some default behavior } void Child::print(int x) { // use Parent''s print method; implicitly passes ''this'' to Parent::print Parent::print(x); }

Tenga en cuenta que Parent es el nombre real de la clase y no una palabra clave.

¿Cómo llamo a la función principal desde una clase derivada usando C ++? Por ejemplo, tengo una clase llamada parent y una clase llamada child que se deriva de padre. Dentro de cada clase hay una función de print . En la definición de la función de impresión del niño, me gustaría hacer una llamada a la función de impresión de los padres. ¿Cómo voy a hacer esto?


En MSVC hay una palabra clave específica de Microsoft para eso: __super

MSDN: le permite declarar explícitamente que está llamando a una implementación de clase base para una función que está anulando.

// deriv_super.cpp // compile with: /c struct B1 { void mf(int) {} }; struct B2 { void mf(short) {} void mf(char) {} }; struct D : B1, B2 { void mf(short) { __super::mf(1); // Calls B1::mf(int) __super::mf(''s''); // Calls B2::mf(char) } };


Me arriesgaré a decir lo obvio: usted llama a la función, si está definida en la clase base, está disponible automáticamente en la clase derivada (a menos que sea private ).

Si hay una función con la misma firma en la clase derivada, puede desambiguarla agregando el nombre de la clase base seguido de dos puntos base_class::foo(...) . Debe tener en cuenta que, a diferencia de Java y C #, C ++ no tiene una palabra clave para "la clase base" ( super o base ), ya que C ++ es compatible con la herencia múltiple, lo que puede generar ambigüedad.

class left { public: void foo(); }; class right { public: void foo(); }; class bottom : public left, public right { public: void foo() { //base::foo();// ambiguous left::foo(); right::foo(); // and when foo() is not called for ''this'': bottom b; b.left::foo(); // calls b.foo() from ''left'' b.right::foo(); // call b.foo() from ''right'' } };

Por cierto, no puede derivar directamente de la misma clase dos veces, ya que no habrá manera de referirse a una de las clases base sobre la otra.

class bottom : public left, public left { // Illegal };


Si el modificador de acceso de la función miembro de la clase base está protegido O es público, puede llamar a la función miembro de la clase base de la clase derivada. Se puede realizar una llamada a la función miembro no virtual y virtual de la clase base desde la función miembro derivada. Por favor consulte el programa.

#include<iostream> using namespace std; class Parent { protected: virtual void fun(int i) { cout<<"Parent::fun functionality write here"<<endl; } void fun1(int i) { cout<<"Parent::fun1 functionality write here"<<endl; } void fun2() { cout<<"Parent::fun3 functionality write here"<<endl; } }; class Child:public Parent { public: virtual void fun(int i) { cout<<"Child::fun partial functionality write here"<<endl; Parent::fun(++i); Parent::fun2(); } void fun1(int i) { cout<<"Child::fun1 partial functionality write here"<<endl; Parent::fun1(++i); } }; int main() { Child d1; d1.fun(1); d1.fun1(2); return 0; }

Salida:

$ g++ base_function_call_from_derived.cpp $ ./a.out Child::fun partial functionality write here Parent::fun functionality write here Parent::fun3 functionality write here Child::fun1 partial functionality write here Parent::fun1 functionality write here


Si su clase base se llama Base y su función se llama FooBar() , puede llamarla directamente usando Base::FooBar()

void Base::FooBar() { printf("in Base/n"); } void ChildOfBase::FooBar() { Base::FooBar(); }


struct a{ int x; struct son{ a* _parent; void test(){ _parent->x=1; //success } }_son; }_a; int main(){ _a._son._parent=&_a; _a._son.test(); }

Ejemplo de referencia.