【发布时间】:2012-11-21 18:23:59
【问题描述】:
我们有一个名为 Student 的父类。我们有一个子类:StudentCS。
学生.h:
#include <iostream.h>
#include<string.h>
#include<vector.h>
#include "Course.h"
class Course;
class Student {
public:
Student();
Student(int id, std::string dep, std::string image,int elective);
virtual ~Student();
virtual void Study(Course &c) const; // this is the function we have a problem with
void setFailed(bool f);
[...]
};
学生.cpp:
#include "Student.h"
[...]
void Student::Study(Course &c) const {
}
我们有 StudentCS.h:
#include "Student.h"
class StudentCS : public Student {
public:
StudentCS();
virtual ~StudentCS();
StudentCS (int id, std::string dep, std::string image,int elective);
void Study(Course &c) const;
void Print();
};
还有 StudentCS.cpp:
void StudentCS:: Study (Course &c) const{
//25% to not handle the pressure!
int r = rand()% 100 + 1;
cout << r << endl;
if (r<25) {
cout << student_id << " quits course " << c.getName() << endl;
}
}
我们主要创建学生:
Student *s;
vector <Student> uniStudent;
[...]
if(dep == "CS")
s = new StudentCS(student_id,dep,img,elective_cs);
else
s = new StudentPG(student_id,dep,img,elective_pg);
uniStudent.push_back(*s);
然后我们打电话去学习,但我们得到的是父母的学习,而不是孩子! 请帮忙!
代码可以编译,但在 uniStudent.Study() 上运行和调用时,它使用父级而不是子级
【问题讨论】:
-
你会在你的程序中正常调用student虚函数吗?将 student 设置为抽象基类并将 study 设置为纯虚函数可能是个好主意。
-
student 中有我们将使用的函数。当我尝试通过执行以下操作使研究成为纯虚函数时: [Virtual void Study(Course &c) =0;] 并擦除 .cpp 文件中的植入,它没有编译。
-
它没有确定编译,因为调用了父方法,这意味着虚拟调用不起作用,因此
StudentCS错过了它的vtable。 -
您没有明确表示 StudentCS 是从 Student 派生的,尽管能够在不强制转换的情况下分配指针意味着它确实如此。我很想相信这段代码并不代表您的实际问题。
-
现在编辑它以显示大部分 StudentCS.h ..
标签: c++ inheritance overriding virtual