Object seilcingオブジェクト切断テスト


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はありません