C++ 多态,虚函数
2015-09-06 23:06
260 查看
虚函数和多态
1.基本概念
如果在类中某个成员函数被定义为虚函数,那么在该类的派送类中如果拥有与基类虚函数函数原型相同的函数同样为虚函数,并且与其基类中的版本构成覆盖关系。
一个指向子类的基类指针或引用子类的基类引用,调用虚函数,若基类的虚函数被子类的覆盖,则调用子类版本而非基类版本,否则调用基类版本,这种语法称为多态。
2.覆盖的条件
成员函数 + 虚函数 + 签名相同
返回基本类型或者对象:必须相同
返回类类型的指针或者引用:允许协变(虚函数之间的返回类型不一样,但存在继承关系,允许返回基类指针或引用)
3.多态的条件
虚函数和覆盖 + 指针(this)/引用
在构造和析构函数中调用自己虚函数没有多态性。
注意:在构造和析构函数中调用自己虚函数没有多态性。根据this的指向,决定调用的版本!!
1.基本概念
如果在类中某个成员函数被定义为虚函数,那么在该类的派送类中如果拥有与基类虚函数函数原型相同的函数同样为虚函数,并且与其基类中的版本构成覆盖关系。
一个指向子类的基类指针或引用子类的基类引用,调用虚函数,若基类的虚函数被子类的覆盖,则调用子类版本而非基类版本,否则调用基类版本,这种语法称为多态。
2.覆盖的条件
成员函数 + 虚函数 + 签名相同
返回基本类型或者对象:必须相同
返回类类型的指针或者引用:允许协变(虚函数之间的返回类型不一样,但存在继承关系,允许返回基类指针或引用)
3.多态的条件
虚函数和覆盖 + 指针(this)/引用
在构造和析构函数中调用自己虚函数没有多态性。
注意:在构造和析构函数中调用自己虚函数没有多态性。根据this的指向,决定调用的版本!!
#include <iostream> using namespace std; class Base { public: Base(void) { // 基类尚未完成构造,this此刻的指向是基类的。 // 构造函数中调用自己的虚函数不存在多态 foo(); bar(); cout << "Base构造结束" << endl; } virtual void foo(void) { cout << "Base::foo()" << endl; } virtual void bar(void) { cout << "Base::bar()" << endl; } void func(void) { // 虽然func不是虚函数,但是仍然存在this指针,存在多态 cout << "Base::func()" << endl; // foo函数和bar函数根据this指针的指向,调用对应版本的虚函数 foo(); bar(); } virtual ~Base(void) { // 同理,析构中子类已被析构,this制作仍然指向基类 // 析构函数中同样调用自己的虚函数不存在多态 cout << "Base析构开始" << endl; foo(); bar(); } }; class Derive : public Base { public: virtual void foo(void) { cout << "Derive::foo()" << endl; } virtual void bar(void) { cout << "Derive::bar()" << endl; } }; int main(void) { Base *p = new Derive(); p->func(); // p指向Derive,则func里的this指针指向Derive,调用的是Derive版本的虚函数 delete p; return 0; }
相关文章推荐
- 项目4.3 摄氏温度转华氏温度
- [转]C#调用C++类(以COM组件的形式)
- C语言变长数组data[0]【总结】
- stl容器中的元素删除方法
- 项目4.2 计算两个并联电阻的值
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- c++ 联合体
- c和c++中NULL和0的区别
- C/C++ IO细节
- c++构造函数&析构函数
- 项目4.1 计算长方形的面积和周长
- C++中Cstring、wstring 和string互相转换总结
- 使用CppUnit进行单元测试
- c++遍历查找文件夹路径下的所有文件(比如.txt) 使用的是MFC的CFileFind类
- C/C++内存泄漏及检测
- 模拟c++的string类
- 学习C++的心得记录
- C++学习笔记(一)--Sales_item类
- C/C++函数如何返回struct或class对象
- 字符串分割(C++)