虚函数

来源:互联网 发布:电脑语音变声软件 编辑:程序博客网 时间: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()函数,这时候已经子类已经析构了,当你调用的时候就会调用不到.





原创粉丝点击