C++之虚函数
来源:互联网 发布:mmd舞蹈动作数据 编辑:程序博客网 时间:2024/04/30 11:36
一、静多态
重载( 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,因为虚函数主要用作对外的接口),主要看子类的用途。
0 0
- 【C/C++】C++之private虚函数
- C++:多态之虚函数
- c函数之【时间函数】
- c函数之【数据结构函数】
- c函数之【随机数函数】
- c函数之【信号函数】
- c函数之【记录函数】
- c函数之【环境变量函数】
- c函数之【动态函数】
- c函数之【其他函数】
- C语言之函数
- C函数之strfry
- C函数之memstr
- c函数之offsetof
- C语言之函数
- C/C++之函数
- C语言之函数
- C-[之函数指针]
- mac go sublime 3
- 图片宽度为控件宽度,高度按比例缩放
- 生成螺旋线形状的随机点
- C# 使用Parallel并行开发Parallel.For、Parallel.Foreach实例
- 约束总结
- C++之虚函数
- 【Get深一度】高斯白噪声之——散粒噪声(shot noise )
- gulp教程之gulp中文API
- 第十六周阅读程序-7
- SAP中采购订单状态与MRP的关系
- PRO-2 Day1
- 政治哲学与幸福根基 (David Miller )
- PCI 总线及地址空间
- 解决eclipse字体太小问题