您现在的位置: 天下网吧 >> 网吧天下 >> 个人电脑 >> 电脑维修 >> 存储设备 >> 正文

深度认识类,对象,内存分配

[作者:电脑店 来源:电脑店 时间:2015-1-10我来说两句

电脑店讯  如果两个类,Parent和Child,Child继承Parent,Parent有一个函数print(),有成员变量pVar,Child中有两个函数print(),privatePrint(),有成员变量cVar,

现在 ,申明一个Parent类型的指针来指向一个Child的对象。

那么用这个指针可以调用privatePrint()函数吗?可以用这个指针可以调用成员cVar吗?

答案是:不能。

那如果Parent中有一个虚函数privatePrint(),那么可以调用到privatePrint()吗?

答案是:可以。

首先我用C++试了一遍。C++的代码如下
代码
1 #include <iostream>
2
3 using namespace std;
4
5 class Prarent
6 {
7 public:
8 Prarent(){};
9 int pVar;
10 void print()
11 {
12 cout<<"I am parent"<< endl;
13 }
14 //virtual void privatePrint(){};
15 };
16
17 class Child : public Prarent
18 {
19 public:
20 Child(){};
21 int cVar;
22 void print()
23 {
24 cout<<"I am child"<< endl;
25 }
26 void privatePrint()
27 {
28 cout<<"I am child' function privatePrint()"<< endl;
29 }
30 };
31
32 void main()
33 {
34 Prarent *parent;
35 Child child; // 原先我竟然写成 Child child = new Child(); 用久了C#, 都是C#惹的祸.
36 parent = &child;
37 parent->print();
38 // parent->privatePrint(); 编译通不过.
39 // 1: 说明父类的指针虽然指向了子类的对象, 但是却不能引用父类没有申明的函数.
40 // 2: 但是你将privatePrint申明为父类的虚函数, 则上面的可以运行成功.
41 }
42
43

其实之前我没有怎么在意这个问题。知道My sen Brother问了我。我才发现问题并非简单。

经过了我们相互的讨论之后,我们得到了一种解释。

我不敢保证一定完全是对的。但是却是我们自己的心得和体会。


理解这个问题。首先要明白两个问题:1:类在内存是怎么存放的?(编译阶段实现)2:对象实例在内存中是怎么存放的?

1:类在内存是怎么存放的?

我根据以前Teacher Lei说过的一些内容,计算机组成,汇编语言,自己看过一些书,得到自己的一种思考。

其中一个类,通过编译分别存在内存的两块地方,一个是代码段,一个是数据段;

代码段存放一个类的成员变量;(IE. 上面的pVar和cVar都是存放在代码段中)

数据段存放一个类的成员函数表;(IE. 上面的print()和privatePrint()都存放于这里);

数据段中的每一个类的内存块应该由两个表填充,一个为虚函数表,一个为非虚函数表;

数据段中类的成员变量存放,如下:

int pVar

int cVar


代码段中类的成员函数表存放,如下:
Parent()

Print()

Child()

Print()

pravtePrint()


下面来解释 2:对象实例在内存中是怎么存放的?

我们拿上面的例子来说明:

当初始化一个Parent *parent 一个指针对象时,这时候parent所指向的地址就是100;


vPtr(虚函数指针) 地址:100

int pVar

当初始化一个Child类型 child 对象时,这时候child的地址就是200;(注意和指针不一样)

vPtr(虚函数指针) 地址:200

int pVar

int cVar




关注天下网吧微信,了解网吧网咖经营管理,安装维护:


本文来源:电脑店 作者:电脑店

相关文章
没有相关文章
声明
本文来源地址:
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com.,本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下