__declspec(novtable)关键字

__declspec (novtable )关键字,表示这个类不生成虚函数表,但是继承类不影响(不管基类是否使用了关键字)。

不使用此关键字,类在生成对象时构造函数和析构函数多要对这个虚函数表进行处理。

使用此关键字就相对省空间,少处理一些代码。


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()

在继承类中,同名虚函数覆盖,并合并到第一张虚函数表中。基类使用或者不使用关键字【__declspec (novtable )】,继承类生成的虚表多是一样的。

写本文前阅读参考了以下文章:

http://blog.sina.com.cn/s/blog_5d2118510100ftzt.html


时间: 2025-01-16 12:31:08

__declspec(novtable)关键字的相关文章

__declspec(novtable)keyword

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

__declspec(novtable)

__declspec(novtable) 的作用是:类不要有虚函数表以及对虚函数表的初始化代码, 这样可以节省运行时间和空间.缺点是该类型对象不能调用虚函数了,一般用于接口. 如下代码: class Base1 { public: virtual void f() {}; virtual void g() {}; }; class __declspec(novtable) Base2 {public: virtual void f() {}; virtual void g() {}; }; cl

c++ __declspec关键字详细用法

__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义.扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展. 用法:__declspec ( extended-decl-modifier ) extended-decl-modifier参数如下,可同时出现,中间有空格隔开: align (C++) allocate app

c++中__declspec用法总结

“__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充.这些属性有:align.allocate.deprecated. dllexport.dllimport. naked.noinline.noreturn.nothrow.novtable.selectany.thread.property和uuid. 1,_declspec(1)用法一定义接口 #include <IOSTREAM>using namespace std;#defin

c++ 中__declspec 的用法

语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{int a, b, c, d, e;}; [转]它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值.同时出现时,前者优先级高. __declspec(align(

[转]c++ 中__declspec 的用法

c++ 中__declspec 的用法 转载地址:http://www.cnblogs.com/ylhome/archive/2010/07/10/1774770.html c++ 中__declspec 的用法 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct

__declspec 纯属转载

c++ 中__declspec 的用法 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{int a, b, c, d, e;}; [转]它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值.同时出现时,前者优先级

__declspec的用法

__declspec用于指定所给定类型的实例与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义.扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展.用法:__declspec ( extended-decl-modifier )extended-decl-modifier参数如下,可同时出现,中间由空格隔开: align (C++)allocate appdoma

__declspec(dllexport)

__declspec(dllexport) (2010-06-17 10:04:28) 转载▼ 标签: __declspec dllexport 导出 it 分类: C 先看代码:以下是在dev-c++里建立自已的dll时的dll.h里面的代码,这里面有一个:_declspec(dllexport) #ifndef _DLL_H_#define _DLL_H_//防重复定义 #if BUILDING_DLL# define DLLIMPORT __declspec (dllexport)#els