web-dev-qa-db-ja.com

派生クラス関数から親クラス関数を呼び出す方法

C++を使用して派生クラスから親関数を呼び出す方法たとえば、parentというクラスと、parentから派生したchildというクラスがあります。各クラス内にprint関数があります。子供の印刷機能の定義で、私は両親の印刷機能を呼び出したいと思います。これをどのようにして行うのでしょうか。

522
IaCoder

私は明白なことを述べるリスクを冒します。もしあなたがその関数を基本クラスで定義されていれば、あなたはそれが派生クラスで自動的に利用可能であると呼びます(privateを除いて)。

派生クラスに同じシグネチャを持つ関数がある場合は、基本クラスの名前の後に2つのコロンbase_class::foo(...)を追加することでそれを明確にすることができます。 C++は 多重継承 をサポートしているため、JavaやC#とは異なり、C++には "基本クラス"(superまたはbase)のキーワードがnotはありません。

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

ちなみに、同じクラスから直接2回派生させることはできません。基本クラスの1つを他のクラスから参照する方法がないからです。

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

Parentという名前の親クラスとChildという名前の子クラスがあれば、次のようなことができます。

class Parent {
public:
    virtual 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はクラスの実際の名前であり、キーワードではありません。

171
Greg Hewgill

基本クラスがBaseで、関数がFooBar()である場合は、Base::FooBar()を使って直接呼び出すことができます

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

void ChildOfBase::FooBar()
{
  Base::FooBar();
}
30
Andrew Rollings

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

22
Andrey

基本クラスメンバ関数のアクセス修飾子がprotected OR 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
4
Ajay yadav

親スコープ解決演算子を使用してparentメソッドを呼び出します。

Parent :: method()

class Primate {
public:
    void whatAmI(){
        cout << "I am of Primate order";
    }
};

class Human : public Primate{
public:
    void whatAmI(){
        cout << "I am of Human species";
    }
    void whatIsMyOrder(){
        Primate::whatAmI(); // <-- SCOPE RESOLUTION OPERATOR
    }
};
0
Dean P