抽象类是否具有虚函数表?

Toanso 2011-09-19 09:00:00
如题,C++中抽象类是否具有虚函数表呢??
按理说如果有又没法生成实例 如何用vptr 调用呢?

困惑啊。。求指点
...全文
705 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2011-09-27
  • 打赏
  • 举报
回复
必定具有!

抽象类是不能实例化,但是可以初始化,也就是它可以有数据成员,而且应该有相应的构造函数来对这些数据成员进行初始化。
moxiaomomo 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lightlater 的回复:]

只有对象才有虚函数表,抽象类的虚函数只是告知子类的对象各个函数的偏移量,便于子类对象进行多态处理!
[/Quote]

对象中不是只有指向类的虚函数表的指针么?
pathuang68 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 supermegaboy 的回复:]

引用 12 楼 toanso 的回复:
引用 9 楼 supermegaboy 的回复:
再者,虚表本来就是编译器实现的产物,并不是语言要求的。
-------------------------------------------------
有这句话就OK了。

C++并不要求vtbl的存在,如果楼主问:这个编译器的抽象类是否有vtbl呢?这是个可以研究的问题,但现在问的是C++……
[/Quote]

的确这东西和编译器的实现有关。

不过,目前我们能接触到的大部分编译器,都是有虚函数表的。
飞天御剑流 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 toanso 的回复:]
引用 9 楼 supermegaboy 的回复:
再者,虚表本来就是编译器实现的产物,并不是语言要求的。
-------------------------------------------------
有这句话就OK了。

C++并不要求vtbl的存在,如果楼主问:这个编译器的抽象类是否有vtbl呢?这是个可以研究的问题,但现在问的是C++中抽象类是否具有虚函数表呢?那就是牛头不搭马……
[/Quote]
有虚表的情况,可以参考lippmen那本经典书,没有的情况,这完全视乎设计者的观念和编译器的设计目标,不过,编译器的设计不是我所从事的工作,我无法给你详细的实现细节,你可请教其它在这方面有经验的开发者。
healer_kx 2011-09-20
  • 打赏
  • 举报
回复
学习了。
Toanso 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 supermegaboy 的回复:]
再者,虚表本来就是编译器实现的产物,并不是语言要求的。
-------------------------------------------------
有这句话就OK了。

C++并不要求vtbl的存在,如果楼主问:这个编译器的抽象类是否有vtbl呢?这是个可以研究的问题,但现在问的是C++中抽象类是否具有虚函数表呢?那就是牛头不搭马嘴,答案是可以有,也可以没有。
[/Quote]

可否详细介绍下 可以有 编译器是怎么操作的, 没有的时候又是怎么操作的?
Toanso 2011-09-20
  • 打赏
  • 举报
回复
我看到的 关于虚函数表的介绍是这样的
对于非虚拟继承 不管派生类是否定义新的虚函数,派生类和基类都使用一个虚函数表
对于虚拟继承,如果派生类没有定义新的虚函数,那么还是使用一个虚函数表,
如果有定义新的那么派生类会有一个新的虚函数表。



是否是这样呢?求指导。。
we_sky2008 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 we_sky2008 的回复:]
一方面虚表主要是用来实现虚拟机制的,虚表中存放本类的虚拟函数的地址,当引用或指针实际指向该类对象抽象时会从虚表中取得函数的地址进行调用,而抽象基类不能定义单独的对象,所以抽象基类的虚表就变得不是必须的,

而另一方面,我们说派生类的虚表会继承或重写基类的虚表,如果抽象类的虚表中对纯虚函数做特殊标记用来表示派生类必须重写它,还有,抽象基类也可以有一般的虚拟函数,这样,如果编译器给抽象基类合成虚表……
[/Quote]
简单点说就是
1.
任何具体对象的VPTR都不会指向抽象基类的VTABLE,这样抽象基类的虚表就显得有点作用不大
2.
派生类的虚表在重写抽象基类的纯虚函数和普通虚拟函数时,如果抽象基类有虚表会比较方便派生类虚表的合成
飞天御剑流 2011-09-19
  • 打赏
  • 举报
回复
再者,虚表本来就是编译器实现的产物,并不是语言要求的。
-------------------------------------------------
有这句话就OK了。

C++并不要求vtbl的存在,如果楼主问:这个编译器的抽象类是否有vtbl呢?这是个可以研究的问题,但现在问的是C++中抽象类是否具有虚函数表呢?那就是牛头不搭马嘴,答案是可以有,也可以没有。
pathuang68 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pathuang68 的回复:]

抽象类是有虚函数表的。

抽象类尽管不能实例化,但是在被派生类继承的时候,在派生类对象中,还是有抽象类的subobject的。

比如:
C/C++ code

class A
{
public:
virtual void fun() = 0;
};

class B : public A
{
int a;
};



那么A和B的内存布局如下:
C/C++ c……
[/Quote]


class A size(4):
+---
0 | {vfptr}
+---

class B size(8):
+---
| +--- (base class A)
0 | | {vfptr}
| +---
4 | a
+---
pathuang68 2011-09-19
  • 打赏
  • 举报
回复
抽象类是有虚函数表的。

抽象类尽管不能实例化,但是在被派生类继承的时候,在派生类对象中,还是有抽象类的subobject的。

比如:

class A
{
public:
virtual void fun() = 0;
};

class B : public A
{
int a;
};


那么A和B的内存布局如下:

/*
class A size(4):
+---
0 | {vfptr}
+---

class B size(8):
+---
| +--- (base class A)
0 | | {vfptr}
| +---
4 | a
+---
*/
we_sky2008 2011-09-19
  • 打赏
  • 举报
回复
一方面虚表主要是用来实现虚拟机制的,虚表中存放本类的虚拟函数的地址,当引用或指针实际指向该类对象抽象时会从虚表中取得函数的地址进行调用,而抽象基类不能定义单独的对象,所以抽象基类的虚表就变得不是必须的,

而另一方面,我们说派生类的虚表会继承或重写基类的虚表,如果抽象类的虚表中对纯虚函数做特殊标记用来表示派生类必须重写它,还有,抽象基类也可以有一般的虚拟函数,这样,如果编译器给抽象基类合成虚表,这会给后继的派生类带来方便,

再者,虚表本来就是编译器实现的产物,并不是语言要求的。

最后,给楼主提供一点信息参考
1.华为的C++培训PPT资料上说抽象基类没有虚表。
2.VC6中抽象基类是合成了虚表的。
天外来客-007 2011-09-19
  • 打赏
  • 举报
回复
只有对象才有虚函数表,抽象类的虚函数只是告知子类的对象各个函数的偏移量,便于子类对象进行多态处理!
Toanso 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]
从实现角度来说,个人理解抽象类应该具有虚函数表,只不过虚表中函数在调用时会引发一个异常,比如vc中pure virtual function call。
[/Quote]

那这个表有啥用呢?也不能调用
Toanso 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 quwei197874 的回复:]
抽象类具有虚函数表,对其子类进行调用
[/Quote]


子类调用的应该是自己的虚函数表吧
机智的呆呆 2011-09-19
  • 打赏
  • 举报
回复
从实现角度来说,个人理解抽象类应该具有虚函数表,只不过虚表中函数在调用时会引发一个异常,比如vc中pure virtual function call。
quwei197874 2011-09-19
  • 打赏
  • 举报
回复
抽象类具有虚函数表,对其子类进行调用

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧