
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(); }
|
近期评论