虚拟函数不适用于 1 个类,但适用于另一个类

Virtual function doesn't work for 1 class, but works for another

本文关键字:适用于 另一个 函数 不适用 虚拟 个类      更新时间:2023-10-16

我的程序有以下结构: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()