スーパー クラス メソッドを呼び出す方法とタイミング 2 つのオプションについては、コード セグメントを参照してください。
class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};
スーパー クラス メソッドを呼び出す方法とタイミング 2 つのオプションについては、コード セグメントを参照してください。
class SuperClass {
public:
void method();
};
class SubClass : public SuperClass {
public:
void someOtherMethdo(){
this->method();
SuperClass::method();
}
};
を使用this->method()
して、スーパークラスに実装されているか、独自のクラスによって実装されている関数を呼び出します。
を使用するときsuperClass::method()
は、親によって実装されたものを必ず呼び出してください。
#include <iostream>
#include <string>
class A {
public:
void func() {
std::cout << "A func" << std::endl;
}
};
class B : A {
public:
void func() {
std::cout << "B func" << std::endl;
}
void exec() {
this->func();
A::func();
}
};
int main() {
B b;
b.exec();
return 0;
}
このサンプルコードは出力します
B func
A func
this->method();
...method
派生クラスを呼び出します(そして、単に書くのと同じですmethod();
)。これにより、親から継承されたメソッドを呼び出すことができます (例ではそうしています)。または、子クラスのオーバーライドされたバージョンを呼び出すこともできます (存在する場合はそうします)。
SuperClass::method();
...常に親のメソッドを呼び出します。この構文は、親クラス メソッドの機能を保持および拡張する場合に、子のオーバーライド内でよく使用されます。例えば
Class SubClass: public SuperClass {
//...
void method() {
SuperClass::method();
//...
}
};
この 2 番目のケースで最初の構文を使用すると、再帰が発生することに注意してください。
virtual
これはメソッドとは関係がないことにも注意してください。メソッドを as としてマークするvirtual
と、メソッドが基本クラス ポインターを介して呼び出されるときに、利用可能な最も派生したクラス メソッドが呼び出されます。上記のコードでは、基本クラスのポインターが含まれていないため、いずれかのメソッドが仮想であるかどうかに違いはありません。
this->method
最初に派生クラスのローカル実装にデフォルト設定されます。それが存在しない場合は、スーパークラス メソッドが使用されます。それが存在しない場合、コンパイルエラーが発生します。
superClass::method()
スーパークラスのメソッドに常に指示します
ほとんどの場合、必要ですthis->method
。superClass::method()
メソッドの一部がスーパークラスに実装されていて、それを派生クラスで拡張したい場合に便利です。何かのようなもの:
Class SubClass : public SuperClass {
public:
void someOtherMethdo(){
SuperClass::someOtherMethdo();
//Rest of the method
}
}
this->method()
特定の状況下ではあいまいさの余地があります (たとえば、複数の祖先method
がこのシグネチャで定義されている場合) が、同時に、method
定義されている正確な場所に関係なく呼び出すことができます。であればmethod
、virtual
最も派生したバージョンを呼び出します。
SuperClass::method()
明示的です。その特定のメソッドを呼び出すか、コンパイラ エラーが発生します。
この特定の例では、違いはありません。
メソッドが次の場合virtual
:
this->method()
関数を動的に呼び出します (クラスの最上位に実装されたバージョンを呼び出します)SuperClass::method()
静的呼び出しになります。this->method();
あなたの場合、またはそれが仮想の場合は親を呼び出します-vtableで実装された関数のトップを呼び出します。SuperClass::method();
親のメソッドを呼び出します。