多态的实现
-
定义:由继承加虚函数实现
-
分类:
- 静态多态(重载):在编译时期就决定调用的函数,根据参数列表来决定。
- 动态多态(子类重写父类的虚函数来实现)在运行期间决定 -
虚函数相关:
- 类中含有虚函数时,编译器会为该类生成一个虚函数表,保存该类的虚函数地址
- 派生类继承基类时,编译器也会为派生类生成自己的虚函数表
- 当有一个基类指针指向派生类,当调用虚函数时,会调用该派生类重写的虚函数;也就是可以调用派生类虚函数表中的虚函数以实现多态。
例如:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class Base
{
public:
void virtual Func()
{
cout << "Base\n";
}
};
class Derived : public Base
{
public:
void Func()
{
cout << "Derived\n";
}
void NewFunc()
{
cout << "New func\n";
}
};
//父类指针1.虚函数使用:是根据实力的对象类型选择调用的函数 2.指针强转
void main()
{
/* Derived* a = new Derived;
a->Func();*/
Base* b = new Derived();
b->Func();
//安全转换
Derived* d = dynamic_cast <Derived*>(b);
if (d != NULL)
{
d->NewFunc();
}
return;
}
析构函数写成虚函数
- 目的:降低内存泄漏的可能性
- 若存在一个基类指向派生类的对象,使用完毕准备销毁时,若基类的析构函数未定义成虚函数时,编译器就会认为当前对象的类型是基类,仅执行基类的析构函数,派生类的内容无法析构,造成内存泄露。