当我们写程序时,多个类中有同名的函数,这样在调用时是否会感觉到麻烦,那又用什么办法解决呢?

我们把在运行之前就完成的联编(是指一个计算机程序自身彼此关联的过程)称为静态联编;在运行时才完成的联编称为动态联编。静态联编支持的多态性称为编译时多态性,通过重载实现,而动态联编所支持的多态性称为运行时多态性,是通过虚函数来实现的。

 虚函数:在某基类中将函数声明为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()函数,这时候已经子类已经析构了,当你调用的时候就会调用不到.