先看一段代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.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 " );
}
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空间。
如果去掉具有错误提示的行,则运行结果为: