c++ virtual function

vtable VS vptr

vtable是函数指针的table,由每个类维护
vptr是指向vtable的指针,由每个对象维护

实例化对象时,编译器会在类的构造函数加代码,设置对象的vptr来指向该类的vtable
多态调用的时候,编译器会插入代码,用基类的指针或者引用来找到vptr,找到vptr就可以访问vtable,进而确定调用哪个派生类的函数

runtime polymorphism

基类中通过在成员函数前加virtual关键字将成员函数声明成虚函数。虚函数用于继承,当使用基类指针或引用调用虚函数时,实际是通过指向或引用的对象类型来判断使用的成员函数。运行时才能确定到底执行的是哪个函数。

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class  {
public:
virtual void foo() {
std::cout << "Base foo" << std::endl;
};
};

class D1 : public Base {
public:
virtual void foo() override {
std::cout << "D1 foo" << std::endl;
}
};

class D2 : public Base {
public:
virtual void foo() override {
std::cout << "D2 foo" << std::endl;
}
};

int main() {
Base *b = new D1;
b->foo();
b = new D2;
b->foo(); // D2 foo
}