一、多态的基本概念
多态(Polymorphism)就是多种状态,在C++中只“一个接口,多个实现方法”。
二、多态的两种方式
C++支持两种多态性:编译时多态性,运行时多态性。
A.编译时多态,通过函数重载实现,静态绑定
B.运行时多态,通过虚函数实现,动态绑定
三、虚函数(virtual)A.非虚函数,调用的函数是由用于调用函数的句柄(指针或引用)类型决定,而不是由句柄所指向的对象的类型决定。
B.虚函数,调用哪个类的虚函数就是由句柄所指向的对象的类型所决定,而非句柄的类型。
四、虚函数实现机制
A.数据结构,virtual函数表,含有虚函数的类,编译器编译时都会为这个类创建一个virtual函数表,每次调用该类的virtual函数时,运行程序都会根据virtual函数表选择正确的函数实现。
B.实现机制,三级指针:virtual函数表中指向函数具体实现的指针;含virtual函数的类的对象指向该类的virtual函数表的指针;用于调用virtual函数的对象句柄。
五、虚函数与析构函数
基类的析构函数一般都是虚函数,这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用,防止在析构时只析构基类而不析构派生类的状况发生。
六、代码例子说明
- #include<iostream>
- using namespace std;
- class A
- {
- public:
- void foo()
- {
- printf("1\n");
- }
- virtual void fun()
- {
- printf("2\n");
- }
- };
- class B : public A
- {
- public:
- void foo()
- {
- printf("3\n");
- }
- void fun()
- {
- printf("4\n");
- }
- };
- int main(void)
- {
- A a;
- B b;
- A *p = &a;
- p->foo();
- p->fun();
- p = &b;
- p->foo();
- p->fun();
- return 0;
- }