Jak wywołać rodzicielską funkcję klasy z pochodnej funkcji klasy?

Jak wywołać funkcję rodzica z klasy pochodnej używając C++? Na przykład, mam klasę o nazwie parent i klasę o nazwie child, która pochodzi od rodzica. Wewnątrz każda klasa ma funkcję print. W definicji funkcji drukowania dziecka chciałbym zadzwonić do funkcji drukowania rodziców. Jak miałbym to zrobić?

Author: Paul Renton, 2008-12-10

6 answers

Podejmę ryzyko stwierdzenia oczywistego: wywołujesz funkcję, jeśli jest zdefiniowana w klasie bazowej, jest ona automatycznie dostępna w klasie pochodnej (chyba że jest to private).

Jeśli w klasie pochodnej istnieje funkcja o tym samym podpisie, możesz ją disambiguate dodając nazwę klasy bazowej, po której następuje dwa dwukropki base_class::foo(...). Należy zauważyć, że w przeciwieństwie do Javy i C#, C++ nie ma słowa kluczowego dla "klasy bazowej" (super lub base), ponieważ C++ obsługuje wiele dziedziczenie , które może prowadzić do niejednoznaczności.

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

Nawiasem mówiąc, nie można wywodzić bezpośrednio z tej samej klasy dwa razy, ponieważ nie będzie sposobu, aby odnieść się do jednej z klas bazowych nad innymi.

class bottom : public left, public left { // Illegal
};
 616
Author: Motti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 09:48:20

Biorąc pod uwagę klasę rodzica o nazwie Parent i klasę potomną o nazwie Child, możesz zrobić coś takiego:

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

Zauważ, że {[1] } jest rzeczywistą nazwą klasy, a nie słowem kluczowym.

 161
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-30 15:59:22

Jeśli twoja klasa bazowa jest wywołana Base, a twoja funkcja jest wywołana FooBar() możesz wywołać ją bezpośrednio używając Base::FooBar()

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

void ChildOfBase::FooBar()
{
  Base::FooBar();
}
 27
Author: Andrew Rollings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 20:21:01

W MSVC istnieje specyficzne dla Microsoft słowo kluczowe: __super


MSDN: Pozwala jawnie stwierdzić, że wywołujesz implementację klasy bazowej dla funkcji, którą nadpisujesz.

// 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
Author: Andrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-26 18:51:57

Jeśli modyfikator dostępu do funkcji członka klasy bazowej jest chroniony lub publiczny, można wywołać funkcję członka klasy bazowej z klasy pochodnej. Wywołanie klasy bazowej nie-wirtualnej i wirtualnej funkcji członka z pochodnej funkcji członka może być wykonane. Proszę zapoznać się z programem.

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

Wyjście:

$ 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
Author: Ajay yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
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();
}

Przykład odniesienia.

 -11
Author: user2170324,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 14:07:17