4

両方のメソッドが仮想として宣言されている場合、呼び出される Method1() の両方のインスタンスが派生クラスの Method1() であってはなりませんか?

BASE と DERIVED が毎回呼び出されるのを見ています。面接のレビューを行っていますが、これが正しいことを確認したいと思います。xD

class BaseClass
{
public:
    virtual void Method1()  { cout << "Method 1 BASE" << endl; }
};

class DerClass: public BaseClass
{
public:
    virtual void Method1() { cout << "Method 1 DERVIED" << endl; }
};


DerClass myClass;
    ((BaseClass)myClass).Method1();
    myClass.Method1();

メソッド 1 BASE
メソッド 1 DERVIED

4

5 に答える 5

14

いいえ、「C スタイル」のキャストは、 myClassをスライス((BaseClass)myClass)して一時BaseClassオブジェクトを作成します。動的型はであり、まったくではないため、呼び出されるのは基本クラスのメソッドです。BaseClassDerClassMethod1

myClass.Method1()直通電話です。myClass参照ではなくオブジェクトであるため、仮想ディスパッチはありません (必要ありません) 。

于 2010-05-05T21:10:35.807 に答える
12

いいえ、仮想関数メカニズムは、関数がポインターまたは参照を介して呼び出された場合にのみ機能するためです。それ以外の場合は、オブジェクトの静的型を使用して、呼び出す関数を決定します。

于 2010-05-05T21:08:22.767 に答える
6

ここに表示されているのは「スライス」と呼ばれるものです。派生クラスのオブジェクトを基本クラスにキャストすると、基本クラスにないものはすべて「スライス」されます。

C++ では、仮想関数はポインターまたは参照に対してのみ正しく機能します。例が正しく機能するためには、次のことを行う必要があります。


DerClass myClass;
((BaseClass *) &myClass)->Method1();

または、あなたができる


BaseClass *pBase = new DerClass;
pBase->Method1();

于 2010-05-05T21:49:11.123 に答える
5

キャストはオブジェクトを からに((BaseClass)myClass)スライスするため、の実装のみが呼び出されます。myClassDerClassBaseClassBaseClassMethod1()

ポリモーフィズムが適切に機能するには、ポインターを介してメソッドを呼び出す必要があります。

DerClass myClass; 
BaseClass* ptrToMyClass = &myClass;
ptrToMyClass->Method1(); // Calls the DerClass implementation of Method1()

または参照:

DerClass myClass; 
BaseClass& refToMyClass = myClass;
refToMyClass.Method1();  // Calls the DerClass implementation of Method1()
于 2010-05-05T21:09:36.217 に答える