C++多态与虚函数
来源:互联网 发布:云顶网络 编辑:程序博客网 时间:2024/05/02 15:30
面向对象程序设计精髓在于继承与多态,为了实现这两功能C++提供了一系列方法,本文介绍多态实现方法。
简单定义一个基类:
class Base{public:void fun(){cout <<"This is Base\n";}int x;};
声明两个派生类
class ClassA : public Base{public:void fun(){cout <<"This is ClassA\n";}int a;};class ClassB : public Base{public:void fun(){cout <<"This is ClassB\n";}int b;};void main(){ClassA a;ClassB b;Base *pa;Base *pb;pa=&a;pb=&b;pa->fun();pb->fun();}
主函数输出的是:
This is Base
This is Base
在基类Base没有声明虚函数情况下什么类型的指针就会调用什么类的函数,pa,和pb都是Base *型指针,只能调用派生类对象a,b中包含的基类的函数。
如果要实现多态性声明基类中函数时要加上virtual
class Base{public:virtual void fun(){cout <<"This is Base\n";}int x;};
当基类的fun声明为虚函数时,派生类相同的fun默认为虚函数,加没加virtual效果一样。
这样主函数输出为:
This is ClassA
This is ClassB
声明虚函数后基类指针会调用其指向派生类对象的函数,这样相同的调用产生不同的实现,从而实现多态。
进一步,需要将析构函数声明为虚函数,考察下面的代码:
Base *p=new ClassA();
delete p;
系统在销毁对象时只会调用基类Base的析构函数。将基类析构函数声明为虚函数后,销毁对象时会先调用派生类析构函数,然后调用基类析构函数,只要将基类的析构够函数声明为虚函数,所有的派生类析构函数将自动变为虚函数。
此外也可以在基类声明纯虚函数:
class Base{public:virtual void fun(){cout <<"This is Base\n";}virtual int vfun() = 0;int x;};
一旦基类声明了纯虚函数,基类将变成纯虚类,不能产生对象,其派生类中必须要实现纯虚函数,哪怕是一个没有任何功能的空函数体,否则编译报错。
class ClassA : public Base{public:void fun(){cout <<"This is ClassA\n";}virtual int vfun(){return 0;}int a;};
小结:
1. 没有声明虚函数情况下根据指针类型判断调用哪个类对象的函数;
2. 声明了虚函数后根据指针所指对象类型判断调用哪个类对象的函数;
3. 虚函数在派生类中必须实现,哪怕是个空函数体;
4. 派生类地址可以父子给基类指针,但是基类地址不能赋值给派生类指针。
- C++_多态与虚函数
- C++_多态与虚函数
- 用C实现多态(重载与虚函数)
- C++:类的多态与虚函数的使用
- c++--多态性与虚函数
- [C++] 多态性与虚函数
- [C++]虚函数与纯虚函数
- c++-虚函数与纯虚函数
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- C02-程序设计基础提高班(C++)第13周上机任务-多态与虚函数
- C语言面向对象编程(三):虚函数与多态
- C语言面向对象编程(三):虚函数与多态
- C语言面向对象编程(三):虚函数与多态
- C语言面向对象编程之三:虚函数与多态
- C/C++虚函数与虚继承
- C++:虚函数与抽象类 zz
- C++Primer-虚函数与默认实参
- 算法基础概念
- 关于期权池Option Pools与Vesting:码农创业防身必备法器
- 计算广告学--笔记(3)
- android之VOLD:staging目录作用与ASEC文件 -总结
- 数据库范式概念解析(第一范式,第二范式,第三范式)
- C++多态与虚函数
- Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- day01_XML
- PostgreSQL与mysql比较
- Android 异常和解决方法积累
- pat 1060. Are They Equal (25)
- HTML基础
- html页面如何实现中英文切换?