虚函数
来源:互联网 发布:电脑语音变声软件 编辑:程序博客网 时间:2024/06/05 20:20
当我们写程序时,多个类中有同名的函数,这样在调用时是否会感觉到麻烦,那又用什么办法解决呢?
我们把在运行之前就完成的联编(是指一个计算机程序自身彼此关联的过程)称为静态联编;在运行时才完成的联编称为动态联编。静态联编支持的多态性称为编译时多态性,通过重载实现,而动态联编所支持的多态性称为运行时多态性,是通过虚函数来实现的。
虚函数:在某基类中将函数声明为virtual ,并在一个或多个派生类中被重新定义的成员函数,
用法格式为:virtual 函数返回类型 函数名(参数表) {函数体}
通过虚函数来实现的多态性——基类指针指向子类对象
构成多态的四个条件:
1.不在同一作用域(分别在父类和子类)
2.函数名相等/参数相等/返回值相同/(协变除外)
3.基类函数必须有virtual关键字
4.访问修饰符可以不同
以下代码为例:
#include<iostream>using namespace std;class A {private:int a;public:A(int t):a(t){}virtual void printf(){cout << "A=" << a << endl;}};class B :public A{private:int b;public:B(int t,int q):A(t),b(q) {}void printf(){cout << "B=" << b << endl;}};int main(){A t1(1);B t2(1,2);A *p;p = &t1;p->printf();p = &t2;p->printf(); return 0;}运行结果:
我们打开简述窗口看一下:
可以看到t1中除了自身成员a,还有_vfptr;t2中有自身成员b,还有A中的成员a,同样有_vfptr,而_vfptr的指向地址就是我们的虚基表的地址
1.为什么静态成员函数不能定义为虚函数?
因为静态成员函数它是一个大家共享的一个资源,但是这个静态成员函数没有this指针,而且虚函数变只有对象
才能能调到,但是静态成员函数不需要对象就可以调用,所以这里是有冲突的.
2.为什么不要在构造函数和析构函数里面调用虚函数?
构造函数当中不适合用虚函数的原因是:在构造对象的过程中,还没有为“虚函数表”分配内存。所以,这个调用
也是违背先实例化后调用的准则
析构函数当中不适用虚函数的原因是:一般析构函数先析构子类的,当你在父类中调用一个重写的fun()函数,虚
函数表里面就是子类的fun()函数,这时候已经子类已经析构了,当你调用的时候就会调用不到.
阅读全文
0 0
- 构造函数 虚函数
- 虚函数 inline函数
- 纯虚函数、虚函数、虚析构函数
- 虚函数,虚析构函数,虚函数表
- 普通函数,虚函数,纯虚函数
- 虚函数,纯虚函数,需析构函数
- 构造函数、析构函数、虚函数
- 构造函数 虚函数 虚析构函数
- 虚函数/构造函数/析构函数
- 构造函数&析构函数&虚函数
- 虚函数
- 虚函数
- 虚函数
- 虚函数
- 虚函数
- 虚函数
- 虚函数
- 虚函数
- Quartus_II_13.1c (64-bit)与仿真器的安装与破解
- 第四周 建立单链表算法库
- AVA技术路线图
- 修改后的日期类
- (欧) 第6章 预处理、const与sizeof
- 虚函数
- hadoop之yarn的资源分配详解
- [NLP]1.StanfordNLP的安装和初探
- 设计模式9-外观模式
- 第四周 建立双链表算法库
- Lua文件夹及文件操作(清空文件夹下所有文件、创建多级文件夹、删除文件夹所有文件等)
- PHP对图像函数进行封装,以左下角为坐标原点
- linux gcc -l参数和-L参数用法含义
- 间歇供料机构