虚函数与普通成员函数的区别
来源:互联网 发布:数控车床车圆球编程 编辑:程序博客网 时间:2024/05/18 21:46
问题
- 问题:类A中使用了类B的成员函数fun(非虚),没有问题。但考虑到,类B以后可能会被继承,所以将类B的fun改为virtual。修改后,程序崩溃。
- 问题代码:
class B{public: virtual void f() { // code } }class A{public: void f() { // some code m_b->f(); }private: B* m_b;}
- 原因:类A中方法f(),在调用 m_b->f()前,未给 m_b实例化。也就说m_b为NULL。
- 原因:当然,给m_b实例化,即可解决问题。但为什么类B的f()未声明为虚函数前,程序运行正确?
- 原因:该问题与普通成员函数和虚函数的调用流程有关。
虚函数与普通成员函数的调用流程
虚函数调用流程(大体)
- 查找this指针(也就是实例)的地址
- 根据this指针,查找虚函数表(函数指针数组)的地址
- 从虚函数表中,取出相应的函数地址
普通成员函数调用流程(大体)
- 由于函数地址在编译期间已确定,所以直接找到该函数地址
- this指针,作为隐含参数传入该函数
- 注意:如果该函数中,使用了实例的成员变量,由于this指针为null,程序会报错。
代码
#include<iostream>class B{public: void out(){ // Error for use object data // std::cout << m_data << std::endl; std::cout << "out" << std::endl; fun(); } void fun() { std::cout << "fun" << std::endl; } virtual void funv() { std::cout << "funv" << std::endl; }private: int m_data;};int main(){ B* b = NULL; b->out(); // No Error b->funv(); // Error }
阅读全文
0 0
- 虚函数与普通成员函数的区别
- 静态成员函数与普通成员函数的区别
- 静态成员函数与普通成员函数的区别
- 类成员函数与普通函数的区别
- 类普通成员函数与函数的区别
- 普通函数指针与类成员函数指针的区别
- C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点
- 静态成员函数与普通成员函数区别
- 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
- 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
- 类的成员函数和普通成员函数的区别
- 类的static成员函数与普通成员函数的区别
- 静态成员函数和普通成员函数的区别?
- 静态成员函数和普通成员函数的区别
- 静态成员函数和普通成员函数的区别
- static函数(非成员函数)与普通函数的区别
- 友元函数,成员函数,普通函数的区别
- C++普通函数,普通成员函数、静态成员函数的区别
- Python机器学习及实践:
- Java 10 新特性解密,引入类型推断机制
- 在MySQL中修改表名的SQL语句
- linux命令 scp
- Java并发编程:volatile关键字解析
- 虚函数与普通成员函数的区别
- 《挑战程序设计竞赛》P87 题目:Find them, Catch them Poj 1703 并查集
- java实现 单点登录SSO
- django timezone datetime 时间转换
- java导出到excel工具类
- 51 nod 数数字
- 全本 | iKcamp翻译 | 《JavaScript 轻量级函数式编程》|《你不知道的JS》姊妹篇
- 首次Android Studio中Git的配置和踩到的坑
- abs在linux 与windows 的不同