目录
抽象类(虚基类这个好像是这么叫还是叫纯虚基类来着,记不清了.不过这个不重要)
多态
多态嘛,固然就是一个物体有多种形态,在C++中就是一个函数名,有多种功能.
函数重载一般叫静多态,接下来介绍的就是动多态.
静多态
在编译阶段决定调用哪个函数
动多态
在运行过程中决定调用哪个函数
虚函数
C++在编译时需要知道调用函数(非虚函数)的地址,也就是早期绑定.
在基类中使用virtual声明函数,派生类重写该函数时,会告诉编译器不要早期绑定该函数,
动态类型和静态类型
只有在基类中有虚函数,派生类重写该函数,并且使用指针或引用指向对象时才会出现动态类型.
满足上述条件后,
派生类B,对象b.
A *a = &b; //此时a的动态类型为B(也可以说a的类型就是B)
如果不满足上述条件
A *a = &b; //此时a的静态类型为B,可以说他根本没有动态类型(也可以说a的类型就是A)
在基类的函数前加上virtual(虚函数)关键字,在派生类中重写该函数,运行时根据实际类型调用函数.
在基类某个函数中声明virtual,则派生类中这个函数都是virtual,不需要在显示声明.
静态类型
#include <iostream>
using namespace std;
class A
{
public:
void show()
{
cout << "A show" << endl;
}
};
class B :public A
{
public:
void show()
{
cout << "B show" << endl;
}
};
int main()
{
B b;
A* a = &b; //A类对象指针指向B类对象
a->show(); //输出A show
return 0;
}
动态类型(多态实现)
此时我们只需要将基类中的show前加上virtual就可以实现多态,也就是动态类型(在运行阶段确定调用哪个函数)
#include <iostream>
using namespace std;
class A
{
public:
virtual void show()
{
cout << "A show" << endl;
}
};
class B :public A
{
public:
void show()
{
cout << "B show" << endl;
}
};
int main()
{
B b;
A* a = &b; //A类对象指针指向B类对象
a->show(); //输出B show
return 0;
}
虚函数表(vtable)
编译器在基类中发现有虚函数