设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 628|回复: 9
打印 上一主题 下一主题

看看这个代码错在哪里.代码不多.

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 03:39:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
考试题.但真找不出有错.请问错在哪里.??
指出下面程序中的错误,在错误处说明出错原因
class A {
public:
A( ) { func(); }
Virtual void func() = 0;
};
main()
{}
2#
发表于 2009-11-3 03:39:11 | 只看该作者
func()=0虚拟不让调用
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 03:39:12 | 只看该作者
和纯虚函数没关系,错误在于构造函数中调用虚拟函数
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 03:39:14 | 只看该作者
class A {
public:
A( ) { func(); }
virtual void func(){}
};
main()
{}

这个是正确的
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 03:39:16 | 只看该作者
不是正确的,我说过了错误在于不能在构造函数中调用这个虚拟函数
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化
而程序中的的func肯定是派生类重载的了
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 03:39:18 | 只看该作者
try this:

  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5. public:
  6. A( )
  7. {
  8. func();
  9. }
  10. virtual void func();
  11. };

  12. //void A::func(){ cout<<"hello"<<endl;} // 大家比较一下这一行隐去和不隐去会有什么区别
  13. // 有一点是明确的, 如果函数被申明为纯虚函数, 那么有没有定义都是不行的.
  14. main()
  15. {
  16. A a;
  17. return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 03:39:20 | 只看该作者
我还是没有理解aogun给我的讲解
我又走回来,打算把我的想法说出来,希望大家改正
我认为,主要原因还是纯虚函数不能调用
而隐含的问题是构造函数中虚函数不是虚函数,可以看成一个普通函数
所以LZ的虚函数没有其实际作用.
因为构造函数中前面有this指针,根本就不可能调用子类的虚函数(c#之所以可以大概就是这里的this也是指针,考虑了虚拟吧)
而aogun说的没有建立虚函数表,我认为不成立.
因为这里如果你想调用子类的虚函数条件就是需要有指针和引用
而这里有了指针和引用就意味着已经建立完了子类
同时虚函数表也应该完成了,所以只是这里虚拟不能调用而已
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 03:39:21 | 只看该作者
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化

指向虚拟函数表的指针是在构造函数里最先被分配的内存,基类的虚拟函数指针指向的虚拟函数表被子类继承(基类构造又是在子类构造函数的前导中完成的,所以子类的虚拟表的长辈已经诞生了),子类又创建一个虚拟指针来指向这个继承的虚拟函数表(修改以后的虚函数表),子类构造函数里的首先是为虚拟指针分配内存.为什么不能调用?


//void A::func(){ cout<<"hello"<<endl;} // 大家比较一下这一行隐去和不隐去会有什么区别


隐去不是没实现吗?调用什么啊?
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 03:39:23 | 只看该作者
我说的不能调用是没有虚拟的效果
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 03:39:25 | 只看该作者
指向虚拟函数表的指针是在构造函数里最先被分配的内存

真的么,这个好东西
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 01:19 , Processed in 0.123532 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表