[C++] vptr, where are you?】的更多相关文章

vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候vptr指针是指向父类的, 向子类.…
给出如下代码段: #include <iostream> #include "stdio.h" using namespace std; class A { public: A(int arg):m_a(arg) { cout << "constructor of A" << endl; output(); } virtual void output() { cout << "output A" &…
在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员.这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决.类型兼容规则中所指的替代包括以下情况: 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对…
#include<iostream> //实现vptr指针初始化问题 using namespace std; class Father { public: Father (int f) { this->f=f; //print(); } virtual void print() { cout<<" 我是父类函数 \n"; } private: int f; protected: }; class Child:public Father { public:…
之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性.后来,发现它就是c++编译器给我们添加的vptr指针. 当类中声明虚函数时,编译器会在类中生成一个虚函数表: 虚函数表是一个存储成员函数指针的数据结构: 虚函数表是由编译器自动生成与维护的: virtual成员函数会被编译器放入虚函数表中: 存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针) 在实现多态的过程中,父类和派生类都…
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的. 2.在遇到通过基类指针或引用调用虚函数的语句时,首先根据指针或引用的静态类型来判断所调函数是否属于该class或者它的某个public 基类,如果 属于再进行调用语句的改写:  C++ Code  1   (*(p->_vptr[slotNum]))(p, arg-list); 其中p是基类指针…
#include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { }; class Z: public virtual X { virtual void f() { } }; class A: public Y, public Z { }; int main() { A *p; cout << "pointer:" << siz…
#include <stdio.h> class Point3d { public: virtual ~Point3d(){} public: static Point3d origin; float x, y, z; }; //从打印的地址看出这个类的结构应该是vptr|x|y|z,vptr是放类空间的头部的 int main() { printf("Point3d::x%p\n", &Point3d::x) ;//这个是求x在类中的偏移量 //printf(&q…
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree是最底层基类(非虚类), CSamplerTree(虚类)派生自CTree,CMSamplerTree,CASamplerTree派生自CSamplerTree, CTree中包括两个成员变量,QList <CTree *> childList;树中有多少个孩子节点:CTree *parent;当…
注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和. 为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面: 1) C++对象模型本身 对于具有虚函数的类型来…