C++类的实现方式
2015-11-25 00:37
323 查看
假设有一个简单类如下:
调用如下:
C++类实现方式:
C++多态的实现原理:
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表示由编译器自动生成和维护
virtul成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象中都有一个只想虚函数表的指针(vptr)
Parent对象:
Child对象:
调用如下:
编译器确定func是否为虚函数:
是:根据对象的VPTR指针找到VTABLE,调用VTABLE中的func()函数(动态链接);
否:直接调用成员函数(静态编译)。
1 当执行父类的构造函数时,c.VPTR指向父类的虚函数表;
2 父类的构造函数执行完成后,c.VPTR只想子类的虚函数表;
class Test{ private: int m; public: Test(int i) { m = i; } int getM(){ return m; } static void print() { cout << "static func" << endl; } };
调用如下:
Test t(1); a.getM(); Test::print();
C++类实现方式:
struct Test { int m; }; // 构造函数 void Test_initialize(Test* this, int i) { this->m =i; } // 普通成员函数中默认传递了一个this指针 int Test_getM(Test* this) { return this->m; } // 静态成员函数中无this指针 void Test_print() { cout << "static func" << endl; } Test t; Test_initialize(&t, 1); Test_getM(&t); Test_print();
C++多态的实现原理:
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表示由编译器自动生成和维护
virtul成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象中都有一个只想虚函数表的指针(vptr)
class Parent { public: virtual void func() { } virtual void func(int n) { } }; VTABLE: void Parent::func(); void Parent::func(int n);
Parent对象:
VPTR = &VTABLE;// 对象初始化完成之后才执行
class Child: public Parent { public: virtual void func() { } virtual void func(int n) { } }; VTABLE: void Child::func(); void Child::func(int n);
Child对象:
VPTR = &VTABLE;// 对象初始化完成之后才执行
调用如下:
void run(Parent* p) { p->func(); }
编译器确定func是否为虚函数:
是:根据对象的VPTR指针找到VTABLE,调用VTABLE中的func()函数(动态链接);
否:直接调用成员函数(静态编译)。
Child c;c.VPTR指针分部初始化:
1 当执行父类的构造函数时,c.VPTR指向父类的虚函数表;
2 父类的构造函数执行完成后,c.VPTR只想子类的虚函数表;
相关文章推荐
- C++之定义模板的demo
- C++之设计模式列表简括
- 020--VS2013 C++ 键盘消息处理
- 文本编辑距离
- 【C语言】中的版本规范(C89 C99等)
- 我阅读过的C/C++开源项目---有的经过有的路过有的啃过有的改过
- [C++] 老鼠走迷宫(使用递回)
- 判断是否存在拓扑结构相同的子树(C++版)
- C++类中的枚举类型
- cppconvnet is on line in gitHub
- qtcreator minggw 支持c++11
- 对C++中异常安全性问题的认识
- C++学习笔记29——泛型算法之插入迭代器
- c++ 11 多线线程系列-------- 一个最简单而且实用的线程池
- 命令行调用编译器
- strcat,strncat函数实现——string.h库函数
- C++primer 第二章
- 【C语言】 模拟计算器
- C语言的那些小秘密之异常处理
- C++中的static和const有什么区别