4

私は C++ を初めて使用し、ポリモーフィズムの概念と関数ポインターについて混乱しています。なんか頭の中が混じってる。

以下に示すコードでは、BaseClass のメソッドを指す関数ポインターを宣言しています。次に、&BaseClass::Print で割り当てました

。最後の 2 行は、私が混乱する部分です。これらの 2 行で同じ結果が得られないのはなぜですか? ポインター myPtr が v-table を指しているためだと思いますが、よくわかりません。また、オーバーライドされた BaseClass::Print() 関数を myPtr に呼び出させたい場合は、どうすればよいでしょうか?

誰か私にこれを明確にしてもらえますか? ありがとう。

#include <iostream>
using namespace std;

class BaseClass{
    public:
        virtual void Print(){
            cout << "Hey!" << endl;
        }
};

class DerivedClass : public BaseClass
{
    public:
        void Print(){
            cout << "Derived!" << endl;
        } 
};

int main()
{
    BaseClass *b = new DerivedClass;

    void (BaseClass::*myPtr)();

    myPtr = &BaseClass::Print;

    (b->*myPtr)(); //print "Derived!"
    b->BaseClass::Print(); //print "Hey!"
}
4

2 に答える 2

4

この行はのメンバーを(b->*myPtr)();呼び出します。は仮想関数であり、ポインタ型を介して呼び出しているため、多態的に検索されます。つまり、(である)の動的タイプに応じた正しい関数が見つかります。BaseClass::PrintbBaseClass::PrintbDerivedClass

2行目は、のメンバーであるメンバー関数をb->BaseClass::Print();明示的に呼び出します。それがまさにこの構文の目的です。「ねえ、ダイナミックタイプが何であるかは気にしない-バージョンと呼んでほしい」と書かれています。PrintBaseClassbBaseClass

于 2013-02-18T22:31:08.110 に答える
1

タイプのオブジェクトを作成した場合でも、DerivedClassそれが継承するクラスに関する情報があります。その場合は-BaseClassです。したがって、使用している場合:

b->BaseClass::Print();

Print()親からメソッドを呼び出すように要求するだけです- BaseClass

于 2013-02-18T22:31:39.500 に答える