zoukankan      html  css  js  c++  java
  • __declspec(novtable)keyword

    __declspec (novtable )keyword,表示这个类不生成虚函数表。可是继承类不影响(无论基类是否使用了keyword)。
    不使用此keyword。类在生成对象时构造函数和析构函数多要对这个虚函数表进行处理。
    使用此keyword就相对省空间,少处理一些代码。


    class Base1
    {
        virtual void f(){}
        virtual void g(){}
    };
    class  __declspec(novtable Base2
    {
        virtual void f(){}
        virtual void g(){}
                void k(){}  //非虚函数
    };

    class   Derived : public Base1, public Base2
    {
        virtual void f(){}
        virtual void h(){}
    };
    Base1 base1;
    Base2 base2;
    例如以下调试:

    base1 中有虚函数表,base2中无虚函数表.
    Base2 *pB2= &base2;
    base2.g(); //成功
    pB2->g();// 指针通过虚函数表来訪问。訪问异常
    pB2->k(); //成功调用非虚函数

    Derived d;
    第一个虚表地址:Derived::f() Base1::g() Derived::h()
    第二个虚表地址:Derived::f() Base::g()

    在继承类中,同名虚函数覆盖。并合并到第一张虚函数表中。

    基类使用或者不使用keyword【__declspec (novtable )】,继承类生成的虚表多是一样的。



    写本文前阅读參考了下面文章:



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    魔法跳舞链 51Nod
    反射
    JDBC---后端服务器与数据库交互的桥梁
    多线程
    IO流
    继承与重写
    java.util包
    多态
    Java.lang包
    异常
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4634917.html
Copyright © 2011-2022 走看看