派生类到基类转换的可访问性和虚函数所占用的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");
}
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空间。
如果去掉具有错误提示的行,则运行结果为: