3

派生クラスのポインタをアップキャストした後も、派生クラスの仮想メソッドが呼び出されますが、スライスが発生するはずだったので、これは間違っているように思われます。このコードの何が問題になっているのかコメントしていただけますか?

class Base
{
public:
    virtual void Hello() { cout << "Hello Base" << endl; }
};

class Derived: public Base
{
public:
    void Hello() { cout << "Hello Derived" << endl; }
};

int main()
{
    Derived* der = new Derived;
    Base* base = dynamic_cast<Base*> (der);
    if (base) base->Hello();
}

出力:Hello Derived

4

2 に答える 2

3

Baseの値を操作せず、ポインタを指定しただけなので、スライスは発生しませんでした。

これにより、スライスが発生します。

Base base = *der;

ただし、関数を呼び出して動的ディスパッチを抑制したい場合は、次のようにすることができます。

base->Base::Hello();

呼び出す関数は静的に指定されます。derもちろん、これは仲介者を避けても機能します。


ここではあなたdynamic_castは必要ありません。これはコンパイル時に簡単に検証できるため、暗黙的にアップキャストできます。ダウンキャストに使用できますstatic_castが、これが実際に正しいかどうかを確認するのはあなた次第です。dynamic_castそのチェックバージョンです。

于 2012-09-06T05:02:50.710 に答える
2

ポインタキャストは静的型システムに関するものであり、コンパイル時に安全です。たとえば、キャスティングはコンパイラに「信頼して」と言っています。実行時には関係ありません。dynamic_castのようなより優れたキャスト操作はいくつかのランタイムチェックを提供します(意味がない限りこれを行わないでください)が、それでもポリモーフィズムには影響しません。何かおかしな。

ポリモーフィズムとは、実行時に正しいことを行うことです。ポインタを介して仮想メソッドを呼び出すと、オブジェクトインスタンスに対して正しい操作が実行されます。

C ++では、::演算子を使用して特定の解決策を要求できますが、これは通常、実装の詳細のために予約されています。

于 2012-09-06T04:49:34.873 に答える