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
la source

6 ответов

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 12:48:20
la source

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 18:59:22
la source

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 23:21:01
la source

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 22:51:57
la source

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 14:16:51
la source
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 18:07:17
la source

Autres questions sur c++ oop inheritance