新微赢技术网
标题:
看看这个代码错在哪里.代码不多.
[打印本页]
作者:
紫恋
时间:
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:
#include <iostream>
using namespace std;
class A
{
public:
A( )
{
func();
}
virtual void func();
};
//void A::func(){ cout<<"hello"<<endl;} // 大家比较一下这一行隐去和不隐去会有什么区别
// 有一点是明确的, 如果函数被申明为纯虚函数, 那么有没有定义都是不行的.
main()
{
A a;
return 0;
}
复制代码
作者:
叛逆ぁ太上皇
时间:
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