虚拟函数不适用于 1 个类,但适用于另一个类
Virtual function doesn't work for 1 class, but works for another
我的程序有以下结构:class Core是基类,class Grad继承Core, class Pass_fail继承Core。Class Student_info只是管理指向这些类的指针,并在运行时根据用户的需要创建合适的对象。问题:类Core, Grad和Pass_fail有一个名为grade()的虚函数。每个班都用自己的方式计算成绩。当程序用Core或Grad对象调用grade()时,它工作得很好。但是当程序为Pass_fail obj调用grade()时,虚拟机制不起作用,而是调用Core.grade()函数。
类核心:
class Core {
friend class Student_info;
public:
Core() : midterm(0), final(0) { std::cerr << "Core obj created" << std::endl; }
Core(std::istream& is);
std::string name() const;
virtual std::istream& read(std::istream&);
virtual double grade() const;
virtual bool valid() const;
virtual bool did_req() const;
virtual ~Core() { }
protected:
virtual Core* clone() const { return new Core(*this); }
std::istream& read_common(std::istream&);
std::istream& read_hw(std::istream&, std::vector<double>&);
double midterm, final;
std::vector<double> homework;
private:
std::string n;
};
类毕业生:
class Grad : public Core {
public:
Grad() : thesis(0) { std::cerr << "Grad obj created" << std::endl; }
Grad(std::istream& is);
double grade() const;
std::istream& read(std::istream&);
bool did_req() const;
protected:
Grad* clone() const { return new Grad(*this); }
private:
double thesis;
};
类Pass_fail:
class Pass_fail : public Core
{
public:
Pass_fail() { std::cerr << "Pass_fail obj created" << std::endl; }
Pass_fail(std::istream&);
std::istream& read(std::istream&);
double grade() const;
//bool did_req() const;
protected:
Pass_fail* clone() { return new Pass_fail(*this); }
};
Pass_fail grade函数:
double Pass_fail::grade() const
{
std::cerr << "Pass_fail grade() function" << std::endl;
if (valid())
return Core::grade();
else
{
std::cerr << "Homework is empty" << std::endl;
return (midterm + final) / 2.0;
}
}
类Student_info(管理指针):
class Student_info {
public:
Student_info(): cp(0) { }
Student_info(std::istream& is) : cp(0) { read(is); }
Student_info(const Student_info&);
Student_info& operator=(const Student_info&);
~Student_info() { delete cp; }
std::istream& read(std::istream&);
bool valid() { return cp->valid(); }
bool did_req() { return cp->did_req(); }
std::string name() const
{
if (cp) return cp->name();
else throw std::runtime_error("uninitialized student");
}
double grade() const
{
if (cp) return cp->grade();
else throw std::runtime_error("uninitialized student");
}
static bool compare(const Student_info& s1, const Student_info& s2)
{
return s1.name() < s2.name();
}
private:
Core* cp;
};
main():
...
vector<Student_info> students;
Student_info record;
...
...
while (record.read(cin))
{
students.push_back(record);
}
....
double final_grade = students[i].grade(); \ the problem is here-> Core.grade() func is called instead of Pass_fail.grade()
我发现了错误,clone()
在Pass_fail
中不是const
,这就是虚拟机制不工作的原因。
Student_info
复制构造函数每次执行students.push_back(record)
都产生。由于Pass_fail
类没有覆盖clone()
,因此产生了错误的clone()
,从而导致错误的grade()
相关文章:
- Makefile 创建两个库 - 一个依赖于另一个
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 相对于另一个向量对一个向量进行排序 - 最有效的方法
- 如何从同一个头文件中定义 2 个类,而一个类依赖于另一个类
- 控制一个字符串是否存在于另一个字符串中(以 C++ 为单位)
- 查找向量的一个向量的元素是否存在于另一个向量中
- g++编译存在于另一个目录中的源文件
- 初始化依赖于另一个类成员的类成员
- cmake:依赖于另一个库的库(sqlite3pp)
- 查找一个字符串(如果它存在于另一个字符串中)
- 类型严格依赖于另一个(嵌套类)语法
- 如何有效地设计一种方法,使每个条件都依赖于另一个条件
- 如何对一个向量相对于另一个向量进行排序
- 依赖于另一个静态库的静态库包含什么?
- CMake和target_link_libraries的库依赖于另一个库
- 如何使一个QGraphicsItem的位置依赖于另一个QGraphicsItem?
- 指定当一个静态库依赖于另一个静态库时所需的链接依赖关系
- 构造对象,其中一个属性依赖于另一个属性.在C++中
- 虚拟函数不适用于 1 个类,但适用于另一个类