当我们写程序时,多个类中有同名的函数,这样在调用时是否会感觉到麻烦,那又用什么办法解决呢?
我们把在运行之前就完成的联编(是指一个计算机程序自身彼此关联的过程)称为静态联编;在运行时才完成的联编称为动态联编。静态联编支持的多态性称为编译时多态性,通过重载实现,而动态联编所支持的多态性称为运行时多态性,是通过虚函数来实现的。
虚函数:在某基类中将函数声明为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()函数,这时候已经子类已经析构了,当你调用的时候就会调用不到.