Object seilcing 对象切割测试

Object seilcing 对象切割测试

阅读侯杰的《深入浅出MFC》里面提到的虚函数的一章,提到了对象切割:
即将一个子类强制转换成父类时,它会把该对象的子类部分切割掉
比如,考虑这样一条强制转换语句:
(CFahter) CChldObject.MemberFunc();
会将子类对象强制转换成父类对象——它会产生一个临时对象,调用了拷贝构造函数
考虑到我写的如下测试代码:
头文件MyObject.h如下:

//这份头文件定义了父类和子类,父类有一个成员函数func1,去调用虚函数vfunc
#pragma once
#include<iostream>
using namespace std;
class CFather 
{
public:
    CFather() 
    { 
        cout << "CFather constuctor!\n"; 
        cout << this << endl;
    }

    //copy constructor 

    CFather(CFather& x)
    {
        cout << "CFahter copy constructor!\n";
        cout << this << endl;
    }

    void func() 
    {
        cout << "CFater func begin!\n";
        vfunc1();
    }

    virtual void vfunc1() 
    {
        cout << "CFather come!\n";
    }
};

class CChild : public CFather
{
public:
    CChild()
    {
        cout << "CChild constuctor!\n";
    }


    virtual void vfunc1()
    {
        cout << "Cchild come!\n";
    }
};

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!

由this指针不同,以及调用了拷贝构造函数,可以看出,确实产生出了一个临时变量。
再次温习一下《深入浅出MFC》所说的对象切割,会把子类的成员部分切割掉,因此,vptr中并没有子类的虚函数vfunc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值