Object seilcingオブジェクト切断テスト
3499 ワード
Object seilcingオブジェクト切断テスト
侯傑の《深入浅出MFC》の中で言及した虚関数の1章を読んで、オブジェクトの切断に言及しました:間もなく1つのサブクラスが強制的に親クラスに変換する時、それはそのオブジェクトのサブクラスの部分を切断します例えば、このような強制変換文を考慮します:
(CFahter) CChldObject.MemberFunc();
はサブクラスの対象を強制的に親オブジェクトに変換します——それは1つの
を生みます
が呼び出され、私が書いたテストコードを考慮すると、ヘッダファイルMyObject.h
は以下の通りです.// , func1, vfunc
#pragma once
#include
using namespace std;
class CFather
{
public:
CFather()
{
cout << "CFather constuctor!
";
cout << this << endl;
}
//copy constructor
CFather(CFather& x)
{
cout << "CFahter copy constructor!
";
cout << this << endl;
}
void func()
{
cout << "CFater func begin!
";
vfunc1();
}
virtual void vfunc1()
{
cout << "CFather come!
";
}
};
class CChild : public CFather
{
public:
CChild()
{
cout << "CChild constuctor!
";
}
virtual void vfunc1()
{
cout << "Cchild come!
";
}
};
main関数は次のとおりです.
#include "MyObject.h"
using namespace std;
int main()
{
CChild child;
// ?
((CFather)child).func();
system("pause");
return 0;
}
実行結果は次のとおりです.
CFather constuctor!
010FF998
CChild constuctor!
CFahter copy constructor!
010FF8CC
CFater func begin!
CFather come!
このポインタが異なり,コピー構造関数が呼び出されたことから,確かに一時変数が生成されたことが分かる.「深入浅出MFC」というオブジェクトカットをもう一度復習すると、サブクラスのメンバー部分がカットされるので、vptrにはサブクラスの虚関数vfuncはありません