用指针呀,了解C++内存结构的话。
-
对于私有成员变量,可以用指针来访问。
-
对于虚函数,也可以用指针来访问。
-
另外,对于私有成员,如果摸不准地址构造,可以先构造一个结构相似的类,然后增加一个公有函数获得内容,然后指针转换,并且用公有函数来访问。
#include <stdio.h>
class A
{
private:
char *str;
public:
A(): str("nothing"){};
};
class B
{
private:
char *str;
public:
B(): str("nothing"){};
char *get()
{
return str;
}
};
- 最后,就是直接定义一个相似的类,然后把私有变成公有,然后强转指针来访问。
但是注意,只对变量有效,对函数无效。
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
A(int i):a(i){}
private:
void print() {cout<<"A"<<endl;}
int a;
};
class B {
public:
void print() {cout<<"B"<<endl;}
int a;
};
int main() {
A a(6);
B *b = (B*)&a;
b->print();
cout << b->a << endl;
return 0;
}
对于类函数(除了上面提到虚拟函数),想要访问,其实就要知道代码区的分布了吧。
那么A类的foo函数和B类的foo函数,如果参数列表一致,怎么区分它们呢?用A类的一个对象调用成员函数,这个成员函数用到成员变量,怎么知道是在用这个对象的数据呢?这个解释,就是this指针。A类的foo(int,int)函数,已经被编译器编译成_foo_A*_int_int,也就是说隐含已经加入了函数所属类的信息,调用A类对象a.foo的时候,已经在调用foo(const A * this,int,int)这个函数。这也解释了,为什么在成员函数内部,使用成员变量,有时候(并不是全部情况下都如此)前面加this和不加this没有区别,编译器已经把foo里面用到的成员变量,用this指针指向了。
原文链接: https://www.cnblogs.com/charlesblc/p/6505362.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/250253
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!