C/C++ 知识管理器:虚拟函数原理
C++ 中虚函数的作用是实现多态机制,即,定义父类指针指向子类对象,通过该指针可以调用子类成员,从而使父类指针具备“ 多种形态 ”
01虚函数表
含有虚函数的类包含用于存储类中各虚函数的函数指针的虚函数表。由该类定义的每个对象都包含指向虚函数表的虚指针。
class Base
{
public:
int data;
virtual void cmp();
virtual void add();
};
Base A; //Base 类对象 A
特别的:
1)虚函数表在编译时创建
2)虚指针在定义对象时生成,并指向虚函数表
3)虚指针位于对象存储的最前方
02应用
派生类无重写基类虚函数(单继承)
派生类虚函数表包括基类原始虚函数和派生类新建虚函数的函数地址。基类原始虚函数地址位于派生类的前方
class Derived : public Base
{
public:
int dir;
virtual void up();
virtual void down();
};
Derived B; //Derived 类对象 B
派生类重写基类虚函数(单继承)
派生类虚函数表包括基类中未被重写的原始虚函数、派生类重写虚函数和派生类新建虚函数的函数地址。基类原始虚函数地址位于派生类前方,被重写的基类虚函数相对位置不变,只是类名由基类改为派生类
class Derived : public Base
{
public:
int dir;
virtual void cmp(); //重写
virtual void up(); //新建
virtual void down(); //新建
}
Derived C; //Derived 类对象 C
//调用说明
Base *bPtr; //基类指针
bPtr = &C; //指针指向对象 C 内存
bPtr->cmp(); //由于虚函数表的存在,执行的是派生类中的 cmp(),实现多态
多重继承
派生类有多个虚函数表,派生类对象包括多个虚指针,其中派生类内部虚函数与最左侧父类共用同一个虚函数表(依据单继承规则)
class Base1
{
public:
int opr;
virtual void move();
virtual void stop();
};
class Derived:public Base,public Base1
{
public:
int user;
virtual void cmp(); //重写Base中虚函数
virtual void move(); //重写Base1中虚函数
virtual void login(); //新建
virtual void logout(); //新建
};
Derived D; //Derived 类对象 D
特别的:
含有纯虚函数的类,被称为抽象类,不能生成对象,即不能实例化,派生类中必须重写实现多态性
//纯虚函数的写法
virtual returntype function() = 0
上一篇: 虚拟函数、虚拟表详解
下一篇: C++ 学习笔记 -- 虚拟函数