C++|用内嵌汇编代码访问基类的私有成员

如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?其实,这些私有成员的确是存在的,而且会被继承,只不过C++编译器杜绝了此种类型的访问。考察如下程序,通过内嵌汇编代码便可以访问类的私有成员。

#include <iostream>
using namespace std;
class A
{
 int i;
 void privateFunc()
 {
 cout<<"this is a private function of base class"<<endl;
 }
public:
 A(){i=5;}
 int getI()
 {
 return i;
 }
 void usePrivateFunc()
 {
 privateFunc();
 }
};
class B:public A
{
	int j;
public:
 void printBaseI()
 {
 cout<<getI()<<endl;
 }
 void usePrivateFunction()
 {
 usePrivateFunc();
 }
};
int main()
{
 B b;
 b.printBaseI();
 b.usePrivateFunction();
	cout<<sizeof(A)<<" "<<sizeof(B)<<endl;
	system("pause");
}
/*
5
this is a private function of base class
4 8
*/

(1)虽然类A没有提供访问私有成员变量i的公有方法,但是在类A(以及类A的派生类)对象中,都包含变量i。

(2)虽然类A并没有提供访问私有成员函数privateFunc()的公有函数,但是在程序代码区依然存有函数privateFunc()的代码,通过内联汇编获取该函数的入口地址,仍然可以顺利调用。

综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员。只不过受到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。

参考:吕吕《C++进阶心法》

-End-

原文链接:,转发请注明来源!