0

次の C++ コードを検討してください。

#include <iostream>

using std::cout;

class A
{
public:
    int a;

    A():a(0)
    {
        cout << "A constructor\n";
    }

    virtual void f()
    {
        cout << "f inside A\n";
    }
};

class C : public A
{
public:
    int c;

    virtual void f()
    {
        cout << "f inside C\n";
    }

    C():c(0)
    {
        cout << "C constructor\n";
    }
};

int main()
{
    A varA = C();

    cout << "Size of C class: " << sizeof(C) << "\n";
    cout << "Size of varA object: " << sizeof(varA) << "\n";

    C* varC = static_cast<C*>(&varA);
    varC->f();

    cout << "varC->a is " << varC->a << "\n";
    cout << "varC->c is " << varC->c << "\n";
}

このプログラムの出力は次のとおりです。

A constructor
C constructor
Size of C class: 16
Size of varA object: 8
f inside A
varC->a is 0
varC->c is 1726166356

varAclass のコンストラクターでオブジェクトを初期化しますC。A クラスと C クラスのコンストラクターが呼び出されますが、これvarAは単なるAオブジェクトです。のアドレスvarAをtype にキャストし、その関数C*を呼び出そうとしましたが、 class の関数を出力するため、アーリー バインディング メカニズムを使用して呼び出していると推測します。この場合のように、派生クラスのコンストラクターを呼び出すと、ベース コンストラクターを呼び出した場合と同じオブジェクトが得られると思います。唯一の違いは、他のコンストラクターが呼び出されることだと思います。私の推測は正しいですか、それとも他に違いはありますか?f()f()A

4

2 に答える 2

4

スライスの典型的な例。A varA = C();の静的および動的タイプのオブジェクトが残りますA。その結果、C* varC = static_cast<C*>(&varA);は未定義の動作を示します。

于 2016-12-14T14:51:37.907 に答える