C++を使用して派生クラスから親関数を呼び出す方法たとえば、parent
というクラスと、parentから派生したchild
というクラスがあります。各クラス内にprint
関数があります。子供の印刷機能の定義で、私は両親の印刷機能を呼び出したいと思います。これをどのようにして行うのでしょうか。
私は明白なことを述べるリスクを冒します。もしあなたがその関数を基本クラスで定義されていれば、あなたはそれが派生クラスで自動的に利用可能であると呼びます(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
};
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
はクラスの実際の名前であり、キーワードではありません。
基本クラスがBase
で、関数がFooBar()
である場合は、Base::FooBar()
を使って直接呼び出すことができます
void Base::FooBar()
{
printf("in Base\n");
}
void ChildOfBase::FooBar()
{
Base::FooBar();
}
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)
}
};
基本クラスメンバ関数のアクセス修飾子が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
親スコープ解決演算子を使用して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
}
};