-
一、概念
虚函数表是一个存在指向虚函数的指针数组,每一个带有虚函数的类都有一个虚函数表。虚函数表与虚函数一样是可以继承。这个表的每一个数组的值都是指向虚函数的指针。
二、虚函数表如何继承与重写
1、一个类继承另外一个带有虚函数的类,并且没有重写和增加虚函数。这个类的虚函数表就和父类一样。
2、当派生类重写了父类的虚函数,则派生类继承父类虚函数表的基础写,对重写的函数对应的数组进行修改。也就是把这个值修改成指向派生类的函数地址。
3、派生类新增了虚函数,则就在虚函数表的末尾增加。
-
三、虚函数表的作用
虚函数表可以支持动态动态,允许基类的指针或引用调用派生类的函数。
例子:
class Base{
public:
virtual void test() { std::cout << "Base::virtual function" << std::endl; }
};
class Derived : public Base {
public:
void test() override { std::cout << "Derived::virtual function" << std::endl; }
public:
void testAdd() { std::cout << "Derived::testAdd()" << std::endl; }
virtual void testAddVi() { std::cout << "Derived::testAddVi()" << std::endl; }
};
int main()
{
Base* obj = new Derived();
obj->test(); //
//只能调用基类继承下来的函数
//obj->testAdd();//不能调用派生类增加的其它函数
//obj->testAddVi();//同样不能调用派生类新加的虚函数
//定义派生类重新指向
Derived* de= dynamic_cast<Derived*>(obj);
de->testAdd();
de->testAddVi();
delete obj;
getchar();
return 0;
}