5

スーパー クラス メソッドを呼び出す方法とタイミング 2 つのオプションについては、コード セグメントを参照してください。

class SuperClass {
public:
 void method();
};

class SubClass : public SuperClass {
public:
 void someOtherMethdo(){
   this->method();
   SuperClass::method();
 }
};
4

6 に答える 6

6

を使用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
于 2012-10-24T13:45:11.167 に答える
5
this->method();

...method派生クラスを呼び出します(そして、単に書くのと同じですmethod();)。これにより、親から継承されたメソッドを呼び出すことができます (例ではそうしています)。または、子クラスのオーバーライドされたバージョンを呼び出すこともできます (存在する場合はそうします)。

SuperClass::method();

...常に親のメソッドを呼び出します。この構文は、親クラス メソッドの機能を保持および拡張する場合に、子のオーバーライド内でよく使用されます。例えば

Class SubClass: public SuperClass {
  //...
  void method() {
    SuperClass::method();
    //...
  }
};

この 2 番目のケースで最初の構文を使用すると、再帰が発生することに注意してください。

virtualこれはメソッドとは関係がないことにも注意してください。メソッドを as としてマークするvirtualと、メソッドが基本クラス ポインターを介して呼び出されるときに、利用可能な最も派生したクラス メソッドが呼び出されます。上記のコードでは、基本クラスのポインターが含まれていないため、いずれかのメソッドが仮想であるかどうかに違いはありません。

于 2012-10-24T13:47:22.383 に答える
4
this->method

最初に派生クラスのローカル実装にデフォルト設定されます。それが存在しない場合は、スーパークラス メソッドが使用されます。それが存在しない場合、コンパイルエラーが発生します。

superClass::method()

スーパークラスのメソッドに常に指示します

ほとんどの場合、必要ですthis->methodsuperClass::method()メソッドの一部がスーパークラスに実装されていて、それを派生クラスで拡張したい場合に便利です。何かのようなもの:

Class SubClass : public SuperClass {
public:
 void someOtherMethdo(){
   SuperClass::someOtherMethdo();
   //Rest of the method
 }
}
于 2012-10-24T13:46:02.350 に答える
3

this->method()特定の状況下ではあいまいさの余地があります (たとえば、複数の祖先methodがこのシグネチャで定義されている場合) が、同時に、method定義されている正確な場所に関係なく呼び出すことができます。であればmethodvirtual最も派生したバージョンを呼び出します。

SuperClass::method()明示的です。その特定のメソッドを呼び出すか、コンパイラ エラーが発生します。

于 2012-10-24T13:45:37.193 に答える
3

この特定の例では、違いはありません。

メソッドが次の場合virtual:

  • this->method()関数を動的に呼び出します (クラスの最上位に実装されたバージョンを呼び出します)
  • SuperClass::method()静的呼び出しになります。
于 2012-10-24T13:46:28.317 に答える
1

this->method();あなたの場合、またはそれが仮想の場合は親を呼び出します-vtableで実装された関数のトップを呼び出します。SuperClass::method();親のメソッドを呼び出します。

于 2012-10-24T13:47:38.087 に答える