C++之虚函数
2016-06-12 12:23
435 查看
一、静多态
重载( C++对C的扩展之函数重载)就是静多态,是在编译的时候就知道了该调用哪个函数。这里重点说明第二部分:动多态的实现之一:虚函数。
二、虚函数
利用虚函数实现的动多态,有三个前提条件:
1、父类中有虚函数;
2、子类覆写(override)父类的虚函数;
3、子类对象赋值父类的指针。
给个例子:
输出结果:
这里稍微点一下父子类间的赋值兼容有三种形式:
1、子类对象赋给父类对象;
2、子类对象赋给父类对象的引用;
3、子类对象赋给父类对象的指针。
这里用这三种赋值兼容的方式进行了演示,显然只有子类对象赋给父类对象的指针实现了虚函数的动多态。
三、虚函数小结
1、声明虚函数是在父类中的成员函数前加virtual关键字。
2、子类可以覆写(override)父类的成员函数,也可以不覆写(不覆写用的就还是父类中的函数)。如果覆写,函数名、参数列表、返回类型必须相同或者是父类虚函数返回类型的子类,其函数前加不加virtual关键字都可以。
3、使用时用父类对象的指针指向子类对象,调用虚函数时,就是调用的子类实现的虚函数。
4、子类覆写的虚函数的访问权限不一定要与父类的虚函数权限一致(一般父类虚函数的访问权限都是public,因为虚函数主要用作对外的接口),主要看子类的用途。
重载( C++对C的扩展之函数重载)就是静多态,是在编译的时候就知道了该调用哪个函数。这里重点说明第二部分:动多态的实现之一:虚函数。
二、虚函数
利用虚函数实现的动多态,有三个前提条件:
1、父类中有虚函数;
2、子类覆写(override)父类的虚函数;
3、子类对象赋值父类的指针。
给个例子:
class Shape{ public: Shape(int x, int y):_x(x), _y(y){} virtual void draw(){ cout << "draw from " << "( " << _x << "," << _y << " )" << endl; } protected: int _x; int _y; }; class Rect: public Shape{ public: Rect(int x, int y, int len, int wid):Shape(x, y), _len(len), _wid(wid){} void draw(){ cout << "draw from " << "( " << _x << "," << _y << " )"; cout << " len = " << _len << " wid = " << _wid << endl; } private: int _len; int _wid; }; class Circle: public Shape{ public: Circle(int x, int y, int rad):Shape(x, y), _radis(rad){} void draw(){ cout << "draw from " << "( " << _x << "," << _y << " )"; cout << " radis = " << _radis << endl; } private: int _radis; }; int main() { Circle c(1, 2, 3); Rect r(4, 5, 6, 7); cout << "-----------子类对象赋给父类对象-------------" << endl; Shape& ps1 = c; ps1.draw(); ps1 = r; ps1.draw(); cout << "-----------子类对象赋给父类对象引用-------------" << endl; Shape ps2 = c; ps2.draw(); ps2 = r; ps2.draw(); cout << "-----------子类对象赋给父类对象指针-------------" << endl; Shape *ps3 = &c; ps3->draw(); ps3 = &r; ps3->draw(); return 0; }
输出结果:
这里稍微点一下父子类间的赋值兼容有三种形式:
1、子类对象赋给父类对象;
2、子类对象赋给父类对象的引用;
3、子类对象赋给父类对象的指针。
这里用这三种赋值兼容的方式进行了演示,显然只有子类对象赋给父类对象的指针实现了虚函数的动多态。
三、虚函数小结
1、声明虚函数是在父类中的成员函数前加virtual关键字。
2、子类可以覆写(override)父类的成员函数,也可以不覆写(不覆写用的就还是父类中的函数)。如果覆写,函数名、参数列表、返回类型必须相同或者是父类虚函数返回类型的子类,其函数前加不加virtual关键字都可以。
3、使用时用父类对象的指针指向子类对象,调用虚函数时,就是调用的子类实现的虚函数。
4、子类覆写的虚函数的访问权限不一定要与父类的虚函数权限一致(一般父类虚函数的访问权限都是public,因为虚函数主要用作对外的接口),主要看子类的用途。
相关文章推荐
- C++异常处理 - 对象篇
- C++静态成员函数小结
- VC++异常捕获
- C++实践 极简版本贪吃蛇小游戏
- 二维数组查找算法(C++)
- C++Primer学习笔记:运行时类别识别
- leetcode #86 in cpp
- 第十六周项目 小玩文件(2)
- LeetCode 115 Distinct Subsequences--In C++
- c/c++中关键字
- 1. Two Sum
- C++运算符重载详解
- 一周stackoverflow热门问题选登:使用过时的C编译器存在安全隐患吗?
- 栈实现计算器
- 函数指针的简单用法
- Implement strStr()
- C++编程规范及标准
- C++入门之一【操作符重载】
- 大整数减法计算思路与算法实现
- C语言中%*s,%*c 是什么意思(还有%*.*s)