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

  先看一段代码:

代码
#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/p/1621098.html