zoukankan      html  css  js  c++  java
  • 纯虚类与虚函数表

    有这么个问题:

    我们知道C++中有虚函数的类会有一个对应的虚函数表,那么纯虚类有虚表吗,如果有的话怎么调用纯虚函数?

    直觉上来讲,应该是有的。 可是既然是纯虚类,说明其对象永远不会被创建,那么维护个虚表貌似也不是很必要了。

    可以设计个程序来验证一下:

    class VirtualBase
    {
    public:
    VirtualBase()
    {
    // call pure virtual function through a non virtual function in base class's constructor
    non_virtual_fun();
    }

    void non_virtual_fun()
    {
    virtual_fun();

    }

    virtual void virtual_fun() = 0;
    };

    class Derived: public VirtualBase
    {
    public:
    virtual void virtual_fun(){}
    };

    int main(int argc, const char* argv[])
    {

    size_t size
    = sizeof(VirtualBase);

    Derived d;
    }
    • sizeof(VirtualBase)返回4,而不是代表空类的1,这说明其内部是有一个虚表指针,而有虚表指针,那么极有可能有一个虚表。
    • 通过上面的程序,我们在实例化Derived时可以调入VirtualBase的构造函数,此时可以在watch窗口中查看this指针,的确有一个虚表指针指向一个虚表
    • 在构造函数中通过一个非虚函数调用一个纯虚函数 - 虽然该纯虚函数在Derived中被实现,但此时还在基类的构造函数中,所以,纯虚函数被调用 - 出错

    纯虚类需要虚表,我能想到的一个原因是在多个派生类中override时,我们需要保证被改写的函数是在正确的偏移地址的,为了保证这个地址是正确的,事先准备一个模板还是比较重要的

  • 相关阅读:
    三点求圆心坐标(三角形外心)
    半平面交
    旋转卡壳
    平面最近点对(HDU 1007)
    凸包
    ACM做题随做随思
    最短路径——SPFA算法
    树链剖分原理
    生成树的计数——Matrix-Tree定理
    次小生成树
  • 原文地址:https://www.cnblogs.com/baiyanhuang/p/1976445.html
Copyright © 2011-2022 走看看