c++ - 호출 - 파생클래스




파생 된 클래스 함수에서 부모 클래스 함수를 호출하는 방법? (4)

C ++을 사용하여 파생 클래스에서 부모 함수를 어떻게 호출합니까? 예를 들어, parent 라는 클래스와 parent 에서 파생 된 child 라는 클래스가 있습니다. 각 클래스에는 print 기능이 있습니다. 자식의 인쇄 함수 정의에서 부모 인쇄 함수를 호출하고 싶습니다. 이 일을 어떻게 하죠?


MSVC에는 Microsoft 특정 키워드가 있습니다. __super

MSDN : 재정의 할 함수에 대한 기본 클래스 구현을 호출하고 있음을 명시 적으로 지정할 수 있습니다.

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

기본 클래스 멤버 함수의 접근 한정자가 public 또는 public 인 경우 파생 클래스에서 기본 클래스의 멤버 함수를 호출 할 수 있습니다. 파생 된 멤버 함수에서 기본 클래스가 아닌 가상 및 가상 멤버 함수를 호출 할 수 있습니다. 프로그램을 참조하십시오.

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

산출:

$ 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

나는 분명히 말할 위험이있다 : 당신이 함수를 호출한다. 기본 클래스에 정의되어 있다면 그것은 파생 클래스에서 자동으로 사용할 수있다 ( private 아닌 한).

파생 클래스에 같은 서명을 가진 함수가 있다면 기본 클래스의 이름 다음에 두 개의 콜론 base_class::foo(...) 를 추가하여 모호성을 제거 할 수 있습니다. Java와 C #과는 달리 C ++에서는 모호성을 유발할 수있는 다중 상속 을 지원하므로 "기본 클래스"( super 또는 base )에 대한 키워드가 없습니다 .

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

덧붙여 말하면, 기본 클래스 중 하나를 다른 클래스보다 참조 할 방법이 없으므로 동일한 클래스에서 두 번 직접 파생시킬 수 없습니다.

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

부모 클래스 이름이 Child 이고 자식 클래스가 Parent 및 Child 클래스 인 경우 다음과 같이 할 수 있습니다.

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

Parent 는 클래스의 실제 이름이며 키워드는 아닙니다.







inheritance