c++-多态和vptr指针】的更多相关文章

在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员.这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决.类型兼容规则中所指的替代包括以下情况: 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对…
之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性.后来,发现它就是c++编译器给我们添加的vptr指针. 当类中声明虚函数时,编译器会在类中生成一个虚函数表: 虚函数表是一个存储成员函数指针的数据结构: 虚函数表是由编译器自动生成与维护的: virtual成员函数会被编译器放入虚函数表中: 存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针) 在实现多态的过程中,父类和派生类都…
多态的原理 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Parent { public: Parent(int a) { this->a = a; } virtual void func(int a) { cout << "Parent::func(int)..." << endl; } virtual void func(int…
#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:…
vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候vptr指针是指向父类的, 向子类.…
1)一个父类: 2)一个子类: 3)我的main函数内容 4)通过结果证明 那么产生了问题,这个print是一个虚函数,不应该  在  我的main函数中   通过调用pp->print,在print函数里面的那个print应该是 子类的啊,为啥是父类的? 1)首先在我运行这个代码: public: Child(int a,int b):Parent(a) { 先执行  父类的 构造函数   也就是那个vptr存的是父类中虚函数表的地址 然后再执行 cout<<"Child(i…
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的. 2.在遇到通过基类指针或引用调用虚函数的语句时,首先根据指针或引用的静态类型来判断所调函数是否属于该class或者它的某个public 基类,如果 属于再进行调用语句的改写:  C++ Code  1   (*(p->_vptr[slotNum]))(p, arg-list); 其中p是基类指针…
原文  https://www.cnblogs.com/zhchngzng/p/4013031.html 虚函数是实现多态的重要元素,请看: class A { public: void a0(){cout <<"a0"<<endl;} virtual void a1(){cout <<"a1"<<endl;} }; class B: public A { public: void a0(){cout <<…
问题:定义一个空的类型,里面没有任何的成员变量或者成员函数,对这个类型进行 sizeof 运算,结果是? 结果是1,因为空类型的实例不包含任何信息,按道理 sizeof 计算之后结果是0,但是在声明任何类型的实例的时候,必须在内存占有一定的空间,否则无法使用这些实例,至于占据多少内存大小,由编译器决定. 继续问:如果在这个类型里添加一个构造函数和析构函数,那么结果又是多少? 还是1,因为我们调用构造函数和析构函数,只需要知道函数的地址即可,而这些函数的地址只和类型相关,和类型的实例无关,编译器不…
多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数. 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数.在每个包含有虚函数的类的对象的最前面(是指这个对象对象内存布局的最前面)都有一个称之为虚函数指针(vptr)的东西指向虚函数表(vtbl),这个虚函数表(这里仅讨论最简单的单一继承的情况,若果是多重继承,可能存在多个虚函数表)里面存放了这个类里面所有虚函数的指针,当我们要调用里面的函…