Saber2pr's Blog

虚函数表

纯虚类(abstract class)

c++中没有 abstract 关键字,也没有 interface 关键字。纯虚类的作用就是充当一个接口。

如果成员都处于未实现状态,这个类就是纯虚类。

class Node { // abstract class
public:
    virtual int getIndex() = 0; // 纯虚函数
};

虚函数与虚函数表

继承纯虚类并重写父类虚函数表。

Rect 类从 Node 类中继承了虚函数表和虚函数表指针,然后 Rect 类把虚函数表重写。

class Rect: public Node {
public:
    // 重写父类虚函数表
    virtual int getIndex(){ // 虚函数
        return 233;
    }
};

class Box: public Rect {
public:
    // 重写父类虚函数表
    int getIndex(){
        return 114514;
    }
};

使用基类指针调用子类实例:

int main(){
    // 基类指针指向子类实例
    Node* node1 = new Rect;
    Node* node2 = new Box;
    std::cout<<node1->getIndex()<<std::endl;
    std::cout<<node2->getIndex()<<std::endl;
}

虽然是定义了基类指针指向子类实例,但是基类类型中就声明了虚表指针,所以虽然访问的是 Node 类的虚表指针,但是指向的却是 Rect 类实例的内存,实际访问放的就是 Rect 类的虚表了。也可以把基类理解为类型标注。