2012-10-24 2 views
5

どのように、いつスーパークラスメソッドを呼び出すのですか?二つのオプションのためのコードセグメントにreferrしてください:あなたはスーパークラスで実装されているいずれかの関数を呼び出すthis->method()を使用してスーパークラス::メソッドまたはthis->メソッドの違い

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

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

答えて

6

、いずれかの独自のクラスで。

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

(複数の祖先が、この署名付きmethodを定義している場合など)、このサンプル・コードは出力

B func 
A func 
3

this->method()は、特定の状況下で曖昧さの余地があろうが、同時になるようにmethodことを可能にします正確にどこに定義されていても呼ばれます。 methodvirtualの場合、最も派生したバージョンが呼び出されます。

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

+0

メソッドが仮想であれば問題にはならないと思います。 2人の親が同じ仮想メソッドを持っていても、その子は同じではない場合はどうなりますか? – sje397

4
this->method 

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

superClass::method() 

はいつもあなたがthis->methodをしたい、多くの場合

あなたのスーパークラスでメソッドに指示します。 superClass::method()メソッドの一部がスーパークラスに実装されていて、それを派生クラスで拡張したい場合に便利です。

Class SubClass : public SuperClass { 
public: 
void someOtherMethdo(){ 
    SuperClass::someOtherMethdo(); 
    //Rest of the method 
} 
} 
3

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

方法はvirtual場合:

    this->method()
  • は、静的呼び出しに
  • SuperClass::method()結果(クラスの一番上の実装バージョンを呼び出す)動的関数を呼び出します。
5
this->method(); 

...は、派生クラスでmethodを呼び出し(単にmethod();の書き込みと同じです)。親から継承されたメソッドを呼び出すこともできますし、子クラスでオーバーライドされたバージョンを呼び出すこともできます。

SuperClass::method(); 

...は常に親のメソッドを呼び出します。この構文は、親クラスのメソッドの機能を保持して拡張したいときに、子のオーバーライド内で頻繁に使用されます。例えば。

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

この2番目のケースで最初の構文を使用すると、再帰が発生します。

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

+0

注:親がこのメソッドを継承している可能性があります。 –

1

this->method();あなたのケースでは親をコールするか、仮想であればvtableで実装されている関数の先頭を呼び出します。 SuperClass::method();は親のメソッドを呼び出します。

関連する問題