子类无法实例化抽象类?

mxmkeep 2009-04-24 12:50:08
大家好,程序来自:钱能的《C++程序设计(第二版)》
程序很多,我简单的写了一些
IDate代表抽象类,Date代表要隐藏的类
程序想在用户界面,即主函数中看不到Date,也无法对IDate声明对象
所以用抽象类做界面,但是我在VS2005编译不通过,
麻烦大家看看是什么问题,改怎么改,谢谢!
//idate.h

#include<iostream>
using namespace std;

class IDate
{
public:
virtual ~IDate(){}
virtual void print(ostream& o)const=0;
};
IDate& createDate(int y,int m,int d);
inline ostream& operator<<(ostream& o,const IDate& d)
{d.print(o);return o;}


//date.h

#include"idate.h"
#include<iostream>

class Date : public IDate
{
int year,month,day;
public:
Date(int y,int m,int d):year(y),month(m),day(d){}
~Date(){}
void print(std::ostream& o)const;
};


//date.cpp
#include"stdafx.h"
#include"date.h"
#include<iostream>
#include<iomanip>
using namespace std;
void Date::print(std::ostream& o)const
{
o<<setfill('0')<<setw(4)<<year<<'-'<<setw(2)<<month<<'-'
<<setw(2)<<day<<"\n"<<setfill(' ');
}
IDate& createDate(int y,int m,int d)
{return *new Date(y,m,d);}
//error C2259: 'Date' : cannot instantiate abstract class
//不能实例化抽象类?
//但是我实例化的是抽象类的子类啊

// mian.cpp
#include "stdafx.h"
#include"idate.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
IDate& d=createDate(2009,04,23);
cout<<d<<endl;
delete &d;
return 0;
}
...全文
1306 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangfan227 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xmanlin 的回复:]

请教一下, 下面定义的到底是一个什么样的对象?
IDate& d=createDate(2009,04,23); (IDate类应当不能实例化, 加一个&能解决什么样的问题?)
[/Quote]
IDate没有实例化,这是父类引用,虚函数相关东西。createDate返回的是Date的实例,可以用父亲引用子类,不关父类是不是抽象类。
hityct1 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ltc_mouse 的回复:]
顺便回复3楼,编译针对加入工程的.cpp进行,而在date.cpp中include了date.h,从而也include了idate.h,所以编译date.cpp时自然知道Date的基类是IDate的;你在VC中把头文件也加进来,是为了自己看起来方便点而已~ 正如,你从来不会把iost…
[/Quote]
对呀,自己糊涂了。
ltc_mouse 2009-04-24
  • 打赏
  • 举报
回复
lz在两个工程中编译的代码完全一样?
在VS2003试了下,如果去除IDate& createDate(int y,int m,int d)等的引用符号,才出现那个错误呀~
使用抽象类的指针和引用形式,不应该有问题的~

顺便回复3楼,编译针对加入工程的.cpp进行,而在date.cpp中include了date.h,从而也include了idate.h,所以编译date.cpp时自然知道Date的基类是IDate的;你在VC中把头文件也加进来,是为了自己看起来方便点而已~ 正如,你从来不会把iostream等系统头文件添加进工程,你却可以使用cin,cout一样~
xmanlin 2009-04-24
  • 打赏
  • 举报
回复
请教一下, 下面定义的到底是一个什么样的对象?
IDate& d=createDate(2009,04,23); (IDate类应当不能实例化, 加一个&能解决什么样的问题?)
mxmkeep 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ljhiiiiiiii 的回复:]
class Date : public IDate
{
int year,month,day;
public:
Date(int y,int m,int d):year(y),month(m),day(d){}
virtual ~Date(){}
virtual void print(std::ostream& o)const;
};
vc6的编译器对不加virtual的重名虚函数的处理不一定符合标准。
提示出现的原因是编译器认为纯虚print函数没有被实现
[/Quote]
我是在VS2005下不能运行,VC6下能运行
我加了virtual也是出现同样的问题
mxmkeep 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wllenyj 的回复:]
我昨天刚看完这章,真是巧了,我到是没试过代码,呵呵

但是那个例子的有个地方错了

C/C++ code
void Data::i2ymd(int absDay){
absDay = absDay>0 && absDay<3650000 ? absDay : 1;
int n = absDay;
for(year=1;n>isLeapYear()+365; n-=isLeapYear()+365,year++);
for(month=1;(month<12&&n>(isLeapYear()&&month>2)+tians[month]);month++);
//我觉得应该是...month<12&&(n>(isLeapYear()&&mont…
[/Quote]
按照操作符优先级
(month<12&&n>(isLeapYear()&&month>2)+tians[month])
month<12&&(n>(isLeapYear()&&mont>2)+tians[month])
这两种写法没区别吧...
mengde007 2009-04-24
  • 打赏
  • 举报
回复
换VS吧;
ljhiiiiiiii 2009-04-24
  • 打赏
  • 举报
回复
class Date : public IDate
{
int year,month,day;
public:
Date(int y,int m,int d):year(y),month(m),day(d){}
virtual ~Date(){}
virtual void print(std::ostream& o)const;
};
vc6的编译器对不加virtual的重名虚函数的处理不一定符合标准。
提示出现的原因是编译器认为纯虚print函数没有被实现
sagegz 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mxmkeep 的回复:]
先谢谢hairetz
正如你说的,贴到VC6.0下运行确没问题
能出结果!
为什么VS2005就不行?!
不是说VS2005比VC6对C++标准支持的更好么?
-_-!!
[/Quote]
我刚试了下,VS2005能通过呀!
VS2005是比VC6.0对标准C++支持的要好啊!
wllenyj 2009-04-24
  • 打赏
  • 举报
回复
我昨天刚看完这章,真是巧了,我到是没试过代码,呵呵

但是那个例子的有个地方错了

void Data::i2ymd(int absDay){
absDay = absDay>0 && absDay<3650000 ? absDay : 1;
int n = absDay;
for(year=1;n>isLeapYear()+365; n-=isLeapYear()+365,year++);
for(month=1;(month<12&&n>(isLeapYear()&&month>2)+tians[month]);month++);
//我觉得应该是...month<12&&(n>(isLeapYear()&&month>2)+...
day = n - (isLeapYear()&&month>2) - tians[month-1];
}
hityct1 2009-04-24
  • 打赏
  • 举报
回复
vs2008,将date.cpp加入到项目中就可以运行了(不加date.h居然也行)。
不把一些信息告诉编译器,编译器怎么知道IDate有哪些子类,并且这些类在哪个文件的哪个地方定义了。
也许有其它方法告诉编译器这些信息。期待高手。
mxmkeep 2009-04-24
  • 打赏
  • 举报
回复
先谢谢hairetz
正如你说的,贴到VC6.0下运行确没问题
能出结果!
为什么VS2005就不行?!
不是说VS2005比VC6对C++标准支持的更好么?
-_-!!
  • 打赏
  • 举报
回复
晕,为何我编译通过,结果也能出来。

65,211

社区成员

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

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