| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1487 人关注过本帖
标题:看看这个代码错在哪里.代码不多.
只看楼主 加入收藏
qvbhsskg
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2005-4-28
收藏
 问题点数:0 回复次数:21 
看看这个代码错在哪里.代码不多.
考试题.但真找不出有错.请问错在哪里.??
指出下面程序中的错误,在错误处说明出错原因
class A {
public:
A( ) { func(); }

Virtual void func() = 0;
};
main()
{}
搜索更多相关主题的帖子: 代码 
2006-06-24 23:41
Satyr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-7
收藏
得分:0 
func()=0虚拟不让调用

C++的博大精深让我叹服
2006-06-25 10:08
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

和纯虚函数没关系,错误在于构造函数中调用虚拟函数

[此贴子已经被作者于2006-6-26 10:06:35编辑过]


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-26 10:06
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
class A {
public:
A( ) { func(); }
virtual void func(){}
};
main()
{}

这个是正确的

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-26 10:13
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
不是正确的,我说过了错误在于不能在构造函数中调用这个虚拟函数
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化
而程序中的的func肯定是派生类重载的了

[此贴子已经被作者于2006-6-26 10:40:52编辑过]


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-26 10:29
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
try this:
[CODE]
#include <iostream>
using namespace std;

class A
{
public:
A( )
{
func();
}
virtual void func();
};

//void A::func(){ cout<<"hello"<<endl;} // 大家比较一下这一行隐去和不隐去会有什么区别
// 有一点是明确的, 如果函数被申明为纯虚函数, 那么有没有定义都是不行的.
main()
{
A a;
return 0;
}
[/CODE]

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-06-26 10:58
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

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


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-26 11:12
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
在 C++ 中,不能从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立,因为在最底层派生的构造函数执行之前,虚表还没有完全被初始化

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

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

隐去不是没实现吗?调用什么啊?

[此贴子已经被作者于2006-6-26 11:49:35编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-26 11:46
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
我说的不能调用是没有虚拟的效果

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-26 11:57
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
指向虚拟函数表的指针是在构造函数里最先被分配的内存

真的么,这个好东西


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-06-26 12:01
快速回复:看看这个代码错在哪里.代码不多.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054157 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved