でオブジェクトを初期化し、次の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
IクラスC
のコンストラクタとvarA
オブジェクトを初期化します。 AクラスとCクラスのコンストラクタが呼び出されますが、varA
は単にA
オブジェクトです。私はvarA
のアドレスをC*
タイプにキャストし、そのf()
関数を呼び出そうとしますが、それはA
のf()
関数を出力するので、それを呼び出すための初期バインディングメカニズムを使用していると推測します。 派生クラスのコンストラクタを呼び出すと、このように、基本コンストラクタを呼び出した場合、同じオブジェクトが取得されると思います。 私は唯一の違いは、他のコンストラクタが呼び出されると思います。私の想定は正しいのですか、それとも他の違いがありますか?
をなぜあなたはC(またはC *)のインスタンスをキャストしていますか?あなたが持っているのは、Aのインスタンスです。あなたの 'static_cast'呼び出しは許可されていない/定義されていないと思います。 –
私はAとCをキャストしてbとcのメンバーをチェックしました。 – Radioga
@Dag - 問題は、 'A'は' A 'なので、 'b'と' c'を持っていないということです。 'C'値から代入するときは、' A'部分を[スライスオフ](http://stackoverflow.com/questions/274626/what-is-object-slicing)し、残りの 'C'部分は破棄しますオブジェクト。 –