C++中虚方法(虚函数)的理解
来源:互联网 发布:诺基亚软件怎么下载 编辑:程序博客网 时间:2024/05/31 06:24
本文简单总结下虚函数的常用事项。
虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(void);
注意:虚函数(虚方法)只针对类的成员函数,普通函数不可声明为虚函数!且一般只有在用到继承时才将基类的成员函数声明为虚函数!
请看如下代码:
1 class parentClass 2 { 3 public: 4 parentClass(); 5 ~parentClass(); 6 7 void func_1(void); 8 virtual void func_2(void); 9 private:10 };11 12 class childClass : public parentClass13 {14 public:15 childClass();16 ~childClass();17 18 void func_1(void);19 virtual void func_2(void);20 private:21 };
假如有以上声明,则在使用以上类时:
1 childClass childTest;2 parentClass *pParentTest = &childTest;3 pParentTest->func_1();4 pParentTest->func_2();
pParentTest指针类型是parentClass基类类型,但它指向的地址对象却是childClass的对象,这种情况下:func_1函数不是虚函数,则调用的是指针类型所在类的函数,即第三句执行的是基类中的func_1函数;func_2函数是虚函数,则调用的是指针指向对象的所在类的函数,即第四句执行的是子类中的func_2函数。
上面两段代码演示了虚函数最基本的使用,简单总结就是:基类中将某方法定义为虚函数,则在派生类中,该方法仍为虚方法。在使用时,定义基类类型的指针,使其指向派生类的对象,使用该指针调用某个方法,若该方法未被声明为虚函数,则调用的是指针类中的方法,若该方法是虚函数,则调用的是指针指向对象类中的该方法。这也即是动态联编。
其他情况:
1) 如上述4行代码,若有pParentTest->func_3();语句,其中func_3函数只在派生类中声明,基类中没有该方法,则会 编译报错 ;
2) 如上述4行代码,若有pParentTest->func_3();语句,其中func_3函数只在基类中声明,派生类中没有该方法,则会 调用基类的方法 ;
3) 如果基类声明被重载了,则应在派生类中重新定义所有的基类版本!如果派生类只重新定义了1个版本,则另外的版本将被隐藏,派生类对象无法调用;
4) 如果派生类要重新定义基类的方法,则派生类中的声明应与基类一致(函数名、参数、返回值),如果派生类的声明与基类参数不一致,则派生类的该方法将覆盖基类中的该方法(不构成重载),派生类对象只能按照派生类方法声明的格式进行调用!(基类中的该方法将被隐藏,派生类对象调用时会报错)
虚方法的一般使用条件:
1) 需要在派生类中重新定义基类的方法,则在基类中将该方法声明为虚方法;
2) 涉及到派生的,一般都将析构函数声明为虚函数;
3) 构造函数不能为虚函数!
4) 友元函数不能是虚函数,因为它不是类的成员函数!
- C++中虚方法(虚函数)的理解
- C++:虚函数理解
- C语言中getchar()函数的理解
- C语言中getchar()函数的理解
- C语言中函数的进一步理解
- C语言中strcpy函数的理解
- 虚函数中“虚”的理解
- c++中对虚函数的理解
- c++中虚函数的理解
- Visual C 中调用其他应用程序的方法(函数)
- c#(WebForm)中调用Javascrip函数的方法
- C++:抽象基类和纯虚函数的理解
- C++:抽象基类和纯虚函数的理解
- C++:抽象基类和纯虚函数的理解
- 虚函数的理解
- 虚函数的理解
- 虚函数的理解
- 虚函数的理解
- C语言中指向函数的指针
- 如何用好vs2015的调试器 ---- 新手必看
- 1046. 划拳(15)
- 树莓派:安装VNC
- skynet底层源码阅读(8)-启动流程
- C++中虚方法(虚函数)的理解
- UVa 11100 The Trip, 2007 (水题)
- anaconda上安装下opencv
- 51nod 1453 抽彩球
- SSD理解
- [Java]关于Java中的数值计算的简单总结
- 程序员的思维修炼
- 「Machine Learning」Learning Theory from CS229 Lecture Notes
- Spring的Aware