首先考虑成员变量在类的继承中的行为 代码41-55行,基类指针可以准确的判断出哪些变量是基类可见的,哪些是“理论上”不可见的。这样的行为是C++类的内存结构所实现的。通过sizeof()我们可以发现这三个类的对象的大小分别为8、12、16。所以这三个类在内存中的摆放应该是这的:
而箭头所指的内存地址就是对象所在的位置。根据你给定的指针的类型的不同,你就只能看到受到限制的这一部分内容了。这里的 三种指针的访问范围就对应了那三个框的范围。
由此可以简单的“越狱”访问你理论上不能访问的东西,这里就不再解释了。
关于函数的部分下次再说吧 = =
#include <iostream>
#include <cstdio>
using namespace std;
//为了方便测试,所有的成员变量都先设定为public
class Parent
{
public:
int zero;
public:
Parent() { this->zero = 0; }
virtual void fun() { cout << "Parent::fun" << endl; }
};
class ChildOne : public Parent
{
public:
int one;
public:
ChildOne() { Parent::Parent(); this->one = 1; }
virtual void fun(){ cout << "ChildOne::fun" << endl; }
};
class ChildTwo : public ChildOne
{
public:
int two;
public:
ChildTwo() { Parent::Parent(); this->two = 2; }
virtual void fun(){ cout << "ChildTwo::fun" << endl; }
};
int main()
{
Parent *p;
ChildOne *o;
ChildTwo *t;
//成员变量
p = new Parent();
cout << p->zero << endl;
o = new ChildOne();
cout << o->zero << endl;
cout << o->one << endl;
delete p;
p = new ChildOne();
cout << p->zero << endl;
// cout << p->one << endl; 无法访问
delete p;
p = (Parent*)new ChildTwo();
cout << p->zero << endl;
// cout << p->one << endl; 无法访问
// cout << p->two << endl; 无法访问
// cout << sizeof(*p) << endl;
// cout << sizeof(*o) << endl;
// cout << sizeof(*t) << endl;
//成员函数
p = new Parent();
p->fun();
delete p;
p = (Parent*)new ChildOne();
p->fun();
delete p;
p = (Parent*)new ChildTwo();
p->fun();
return 0;
}