派生类到基类转换的可访问性和虚函数所占用的sizeof空间

本文通过一个具体的C++代码示例,详细解释了私有继承导致的访问控制问题,以及虚函数在内存中所占的空间大小。特别讨论了如何在派生类中重写基类的虚函数,并分析了不同类型的类实例所占的内存空间。

  先看一段代码:

ExpandedBlockStart.gif代码
#include <iostream>
using namespace std;

class Base{
public:
    
virtual void fun()
    {cout 
<< "Base" << endl;}
    
    
int geti()
    {
return i;}
    
    
void seti(int val)
    {i 
= val;}
protected:
    
int j;
private:
    
int i;
};

class Son : private Base{
public:
    
int use_base()
    {
return j;}
private:
    
void fun()
    {cout 
<< "son1" << endl;}
    
int val;
};

class Test{
    
virtual void fun()
    {cout 
<< "Base" << endl;}
};

void myfun(Base& obj)
{
    obj.fun();
}

void main()
{
    Son s;
    Base b;   
    cout 
<< "sizeof(Base) " << sizeof(Base) << endl;
    cout 
<< "sizeof(Son) " << sizeof(Son) << endl;
    cout 
<< "sizeof(Test) " << sizeof(Test) << endl;
    myfun(s);   
//错误提示:error C2243: “类型转换”: 从“Son *”到“Base &”的转换存在,但无法访问
     myfun(b);
    system(
"pause");
}

 

  关于错误提示,s因为是private继承类的对象,继承来的成员函数fun()变为自己的private成员函数,因此,在myfun()中,代码不能直接访问已经成为private的成员函数fun()。

 

  关于虚函数的占用空间,在32位机器上,一个虚函数占用4B空间。

 

  如果去掉具有错误提示的行,则运行结果为:

  

转载于:https://www.cnblogs.com/younes/archive/2009/12/10/1621098.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值