关于vptr指针初始化的分步】的更多相关文章

vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候vptr指针是指向父类的, 向子类.…
#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:…
//多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类中的成员函数本质上是C语言中的全局函数,只是在全局函数的参数列表中多加了一个结构体指针参数 详解: 对于类中没有用virtual关键字修饰的成员函数,c++编译器在静态编译的时候,c++就会确定对象调用的全局函数 当类中声明虚函数时,c++编译器会在静态编译的时候为这个类生成一个虚函数表, 虚函数表是一个存储…
在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 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…
1.严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置. (1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好指向程序代码的位置会导致一些很隐蔽的错误. (2)未被初始化之前禁止指针之间的赋值. 例如: #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* ar…
1.Node * p:if(p)//报错 2.Node * p=NULL;if(p)//不报错 注意把指针初始化,否则指针将指向任意位置…
1)一个父类: 2)一个子类: 3)我的main函数内容 4)通过结果证明 那么产生了问题,这个print是一个虚函数,不应该  在  我的main函数中   通过调用pp->print,在print函数里面的那个print应该是 子类的啊,为啥是父类的? 1)首先在我运行这个代码: public: Child(int a,int b):Parent(a) { 先执行  父类的 构造函数   也就是那个vptr存的是父类中虚函数表的地址 然后再执行 cout<<"Child(i…
上面的代码会打印“A”. C++ 类指针定义的时候没有初始化的时候,居然可以安全的调用类内部的成员函数而不出错. 在网上查了一下:   初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函数而不出错,但是如果类成员函数中调用了类成员变量则会出错,既然赋值为NULL的情况都可以使用,那么自然不初始化的类指针同样满足这类情况.   假设现在有一个简单的类定义如下:class Test{public:    void func(){cout << "hahaha" &…