请教:虚函数表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.,但是还是没有写太清楚。所以请教一下大家。谢谢了先!