继承 抽象类, 派生类也成抽象的了?不知是哪里的问题?

Crazy_hand 2011-03-02 07:39:29

//所有课程的课程总表
class Course;
typedef vector< Course > courseTable;

class Student{

public:
Student( );
explicit Student( int ID, string na, string birthday, string gender, string department, int grade )
: studentID( ID ), name( na ), birthday( birthday ),
gender( gender ), department( department ), grade( grade )
{
/* EmptyBody*/
}

//可按课程名, 课程编号, 教师名三种方式查询课程
virtual void SearchCourseName( const string name, const courseTable &ct ) const;
virtual void SearchCourseID( const int courseID, const courseTable &ct ) const;
virtual void SearchCourseTecr( const string Tecr, const courseTable &ct ) const;

//添加/删除选课函数
virtual void joinCourse( const int courseID, const courseTable ct ) const = 0;
virtual void leaveCourse( const int courseID ) const = 0;
//显示已选课程信息
virtual void showMyCourses( const courseTable &ct ) const = 0;

~Student( ) { /*EmptyBody*/ }
private:
int studentID; //学生ID
string name; //姓名
string birthday; //生日
string gender; //性别
string department; //院系
int grade; //入学年份
};

//本科生
class UndergraduateStu : public Student{

public:
//构造函数
UndergraduateStu( );
explicit UndergraduateStu( int ID, string na, string birthday, string gender, string department,
int grade, int groupID, string tutor )
: Student( ID, na, birthday, gender, department, grade ),
groupID( groupID ), tutor( tutor )
{
/* EmptyBody */
}

////可按课程名, 课程编号, 教师名三种方式查询课程
//virtual void SearchCourseName( const string name, const courseTable &ct ) const;
//virtual void SearchCourseID( const int courseID, const courseTable &ct ) const;
//virtual void SearchCourseTecr( const string Tecr, const courseTable &ct ) const;

//添加、删除选课函数
virtual void joinCourse( const int courseID, const courseTable &ct );
virtual void leaveCourse( const int courseID );
//显示已选课程信息
virtual void showMyCourses( const courseTable &ct );

~UndergraduateStu() { /*EmptyBody*/ }

private:
int groupID; //班号
string tutor; //辅导员
set< int > cours; //该学员已选课程
int totalCredit; //该学员已选课程的总学分
};

UndergraduateStu st; //这样写的时候,VS10 说不能使用抽象类
...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gules 2011-03-02
  • 打赏
  • 举报
回复
这是因为你在写派生类的成员函数
virtual void joinCourse( const int courseID, const courseTable &ct );
的原型与基类的纯虚函数
virtual void joinCourse( const int courseID, const courseTable ct ) const = 0;
不一致导致“覆盖”的情形,而不是“重写”。
派生类的成员函数的原型少了const属性,同时const courseTable ct参数最好也要一致,否则派生类因为没有重写基类的纯虚函数而依然为抽象类,不能定义对象。
Crazy_hand 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
如果派生类不实现纯虚函数的话,派生类也是抽象的.
[/Quote]

[Quote=引用 6 楼 pengzhixi 的回复:]
引用 5 楼 crazy_hand 的回复:
不知道具体什么地方的问题,把strudent里面的需要派生的函数在UndergraduateStu 粘贴了一遍,去掉 = 0, 已经不报错了。。。

因为你的派生类并没有实现基类的纯虚函数,所以派生类也是抽象类,基础知识,去看看书吧
[/Quote]

可我现在也没有给在UndergraduateStu 中的虚函数实现, 不过,我使用UndergraduateStu st; 这样的语句已经不报错了。

刚才的错误可能是有什么地方和基类里面有写的不一样的地方。
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 crazy_hand 的回复:]
不知道具体什么地方的问题,把strudent里面的需要派生的函数在UndergraduateStu 粘贴了一遍,去掉 = 0, 已经不报错了。。。
[/Quote]
因为你的派生类并没有实现基类的纯虚函数,所以派生类也是抽象类,基础知识,去看看书吧
Crazy_hand 2011-03-02
  • 打赏
  • 举报
回复
不知道具体什么地方的问题,把strudent里面的需要派生的函数在UndergraduateStu 粘贴了一遍,去掉 = 0, 已经不报错了。。。
qq120848369 2011-03-02
  • 打赏
  • 举报
回复
如果派生类不实现纯虚函数的话,派生类也是抽象的.
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
你没有对
virtual void joinCourse( const int courseID, const courseTable ct ) const = 0;
virtual void leaveCourse( const int courseID ) const = 0;
//显示已选课程信息
virtual void showMyCourses( const courseTable &ct ) const = 0;

提供具体的实现啊
heguodong 2011-03-02
  • 打赏
  • 举报
回复
检查派生类的对应方法签名与基类的十分一致
另外注意析构函数应该为虚
leonwei 2011-03-02
  • 打赏
  • 举报
回复
把UndergraduateStu类的virtual去掉试试?

64,637

社区成员

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

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