2016-07-26 8 views
2

は、私は、例えばコードベローズに表示されるインスタンスオブジェクトからメソッドを呼び出すために奇妙な方法を発見した:インスタンスオブジェクトからメソッドを呼び出すための奇妙な方法...

class Example{ 
public: 
    void Print(){ std::cout << "Hello World" << std::endl;} 
}; 

int main(){ 
    Example ex; 
    ex.Example::Print(); // Why use this notation instead of just ex.Print(); 
    return 0; 
} 

ex.Example :: Print()と標準の方法ex.Print()の間には動作上の違いがありますか?なぜ後者の代わりに前者を使用したのか?この例ではex.Example::Print()ex.Print()を呼び出すとの間で予め

答えて

9

違いはex.Example::Print()あなたはクラスExampleで定義されたPrint()のバージョンをしたいことを指定していることです。この特定の例では、違いはありません。ただし、次の点を考慮してください

#include <iostream> 

class One { 
    int i; 

    public: 
    One(int ii) : i(ii) {} 
    virtual void print() { std::cout << i << std::endl; } 
}; 

class Two : public One { 
    int j; 

    public: 
    Two(int ii, int jj) : One(ii), j(jj) {} 
    void print() override { 
     One::print(); 
     std::cout << j << std::endl; 
    } 
}; 

class Three : public Two { 
    int k; 

    public: 
    Three(int ii, int jj, int kk) : Two(ii, jj), k(kk) {} 
    void print() override { 
     Two::print(); 
     std::cout << k << std::endl; 
    } 
}; 

int main() { 
    Three four(1, 2, 3); 

    four.print(); 
    std::cout << std::endl; 

    four.One::print(); 
    std::cout << std::endl; 
    four.Two::print(); 
    std::cout << std::endl; 
    four.Three::print(); 
    std::cout << std::endl; 
} 

出力は次のようになります。

1 
2 
3 

1 

1 
2 

1 
2 
3 
0

ませ差の

感謝。

私が考えることができるこの呼び出しの唯一の使用/利点は、継承によるものです。派生クラスのインスタンスからこの構文を使用して、親クラスのover-riddenメソッドを明示的に呼び出すことができます。投稿のコードを考える

5
ex.Example::Print(); // Why use this notation instead of just ex.Print(); 

、それは同じです:

ex.Print(); 

これは、名前の隠蔽が戦場に出た場合にのみ、違いを生むだろうと、あなたは、特定のバージョンを呼び出すことについて、明示的になりたいです関数。

例:

struct Foo 
{ 
    void Print() const { std::cout << "Came to Foo::Print()\n"; } 
}; 

struct Bar : Foo 
{ 
    void Print() const { std::cout << "Came to Bar::Print()\n"; } 
}; 

int main() 
{ 
    Bar b; 
    b.Print(); // Calls Bar::Print() 
    b.Foo::Print(); // Calls Foo::Print() 
} 

物事の仕組みのちょうど仕組みです。設計上の選択として、virtual関数を使用する方がよいでしょう。

struct Foo 
{ 
    virtual void Print() const { std::cout << "Came to Foo::Print()\n"; } 
}; 

struct Bar : Foo 
{ 
    virtual void Print() const { std::cout << "Came to Bar::Print()\n"; } 
}; 
関連する問題