标题:请教:虚函数表vtable与类的内存布局的位置关系
只看楼主
FollowDream
Rank: 2
等 级:论坛游民
帖 子:33
专家分:14
注 册:2017-1-12
结帖率:33.33%
 问题点数:0 回复次数:0 
请教:虚函数表vtable与类的内存布局的位置关系
假设现在有个基类叫Student学生,又有个派生类叫Graduate研究生(多了一个叫pay的成员):
程序代码:
class Student {
protected: //派生类可以访问protected成员
     int num;
     string name;
     float score;
public:
     Student(int n, string m, float s) //构造函数
     void display() //一般函数
};

class Graduate: public Student { //声明public派生类Graduate
private:
     float pay;
public:
     Student(int n, string m, float s, float p) //构造函数
     //这里可不可以直接写Graduate(int n, string m, float s, float p): Student(n,m,s), pay(p) {}?
     void display() //一般函数
};
Graduate::Graduate(int n, string m, float s, float p): Student(n,m,s), pay(p) {} //如果这个构造函数想写进Graduate的class里,是不是按上面那样写?

int main() {
     Student stud1(1001,"Zhang",87); //定义Student类对象stud1
     Graduate grad1(2001,"Wang",98, 1000); //定义Graduate类对象grad1
     Student *pt=&stud1; //定义指向基类对象的指针变量pt
     pt->display();
     pt=&grad1; //定义指向基类对象的指针变量pt
     pt->display(); //指针变量pt指向派生类对象,但是运行结果没有派生类pay的值!
}


1 首先想请教一下Graduate构造函数。是否可以在Graduate()这个类的内部直接写 Graduate(int n, string m, float s, float p): Student(n,m,s), pay(p) {}、而不是像原来那样抽出来写Graduate::Graduate()呢?

2 其次想请教一下类的内存布局。基类Student比派生类Graduate少了一个叫pay的成员;那么是不是说,派生类Graduate的内存布局和基类Student一模一样,都是int n, string m, float s, void display()这样连续的内存挨在一起,只不过派生类Graduate多了一段由pay产生的内存?函数void display()不同于int或者string,作为一个函数它又该占用多大内存呢?

3 最后想请教一下虚函数表vtable与类的内存布局的位置关系。如果在Student类中声明display函数时,把display虚化virtual void display(); 那么是不是说,vtable这时候跳到了内存区间的第一位,内存布局从原来int n, string m, float s, void display()这样的布局,变成了vtable(含display函数?), int n, string m, float s这样的布局?

我搜了一下,网上有一些信息,比如http://blog.和http://blog.,但是还是没有写太清楚。所以请教一下大家。谢谢了先!
搜索更多相关主题的帖子: 虚函数 研究生 
2017-06-04 10:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477638-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015594 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved