新微赢技术网

标题: 看看这个代码错在哪里.代码不多. [打印本页]

作者: 紫恋    时间: 2009-11-3 03:39
标题: 看看这个代码错在哪里.代码不多.
考试题.但真找不出有错.请问错在哪里.??
指出下面程序中的错误,在错误处说明出错原因
class A {
public:
A( ) { func(); }
Virtual void func() = 0;
};
main()
{}
作者: 火箭筒︻$▅    时间: 2009-11-3 03:39
func()=0虚拟不让调用
作者: ☆蘫弧ゞ无悔    时间: 2009-11-3 03:39
和纯虚函数没关系,错误在于构造函数中调用虚拟函数
作者: o.筎茈菰箪き    时间: 2009-11-3 03:39
class A {
public:
A( ) { func(); }
virtual void func(){}
};
main()
{}

这个是正确的
作者: 羽衣独舞    时间: 2009-11-3 03:39
不是正确的,我说过了错误在于不能在构造函数中调用这个虚拟函数
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化
而程序中的的func肯定是派生类重载的了
作者: 卐孬孬卐    时间: 2009-11-3 03:39
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. }
复制代码

作者: 叛逆ぁ太上皇    时间: 2009-11-3 03:39
我还是没有理解aogun给我的讲解
我又走回来,打算把我的想法说出来,希望大家改正
我认为,主要原因还是纯虚函数不能调用
而隐含的问题是构造函数中虚函数不是虚函数,可以看成一个普通函数
所以LZ的虚函数没有其实际作用.
因为构造函数中前面有this指针,根本就不可能调用子类的虚函数(c#之所以可以大概就是这里的this也是指针,考虑了虚拟吧)
而aogun说的没有建立虚函数表,我认为不成立.
因为这里如果你想调用子类的虚函数条件就是需要有指针和引用
而这里有了指针和引用就意味着已经建立完了子类
同时虚函数表也应该完成了,所以只是这里虚拟不能调用而已
作者: 依然范特西    时间: 2009-11-3 03:39
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化

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


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


隐去不是没实现吗?调用什么啊?
作者: 赌神    时间: 2009-11-3 03:39
我说的不能调用是没有虚拟的效果
作者: 木子    时间: 2009-11-3 03:39
指向虚拟函数表的指针是在构造函数里最先被分配的内存

真的么,这个好东西




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2