Comment appeler une fonction de classe mère à partir d'une fonction de classe dérivée?

comment appeler la fonction parent d'une classe dérivée utilisant C++? Par exemple, j'ai une classe appelée parent , et une classe appelée child qui est dérivé de parent. Dans chaque classe est dotée d'une fonction print . Dans la définition de la fonction d'impression de l'enfant, j'aimerais faire un appel à la fonction d'impression des parents. Comment pourrais-je aller sur le faire?

477
demandé sur Paul Renton 2008-12-10 22:35:45

6 réponses

je prends le risque d'énoncer l'évidence: vous appelez la fonction, si elle est définie dans la classe de base, elle est automatiquement disponible dans la classe dérivée (à moins qu'elle ne soit private ).

S'il y a une fonction avec la même signature dans la classe dérivée, vous pouvez la désambiguer en ajoutant le nom de la classe de base suivi de deux colons base_class::foo(...) . Vous devriez noter que contrairement à Java et C#, C++ ne pas ont un mot-clé pour "la classe de base" ( super ou base ) puisque C++ supporte héritage multiple ce qui peut conduire à une ambiguïté.

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'
    }
};

soit dit en passant, vous ne pouvez pas dériver directement de la même classe deux fois puisqu'il n'y aura aucun moyen de faire référence à l'une des classes de base par rapport à l'autre.

class bottom : public left, public left { // Illegal
};
616
répondu Motti 2017-01-11 09:48:20

classe de parent nommée Parent et classe d'enfant nommée Child , vous pouvez faire quelque chose comme ceci:

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);
}

notez que Parent est le nom réel de la classe et non un mot clé.

161
répondu Greg Hewgill 2018-07-30 15:59:22

si votre classe de base s'appelle Base , et que votre fonction s'appelle FooBar() , vous pouvez l'appeler directement en utilisant Base::FooBar()

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

void ChildOfBase::FooBar()
{
  Base::FooBar();
}
27
répondu Andrew Rollings 2015-05-31 20:21:01

dans MSVC il y a un mot-clé spécifique de Microsoft pour cela: __super


MSDN: Vous permet d'indiquer explicitement que vous appelez une implémentation de classe de base pour une fonction que vous supplantez.

// 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)
   }
};

18
répondu Andrey 2009-05-26 18:51:57

si le modificateur d'accès de la fonction de membre de la classe de base est protégé ou public, vous pouvez appeler la fonction de membre de la classe de base à partir de la classe dérivée. Appel à la classe de base non-virtual et la fonction de membre virtuel de la fonction de membre dérivé peut être fait. Veuillez renvoyer le programme.

#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;
}

sortie:

$ 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
3
répondu Ajay yadav 2015-12-25 11:16:51
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();
}

exemple de référence.

-11
répondu user2170324 2014-06-02 14:07:17