首页 > 解决方案 > 关于抽象类(cpp)的运算符重载

问题描述

在 student.h 文件中

class Student {
 protected:
  string Name;
  int Stu_num;
 public:
  virtual void print() = 0;
  // constructor...
}

class Grad_Student: public Student {
 private:
  string Lab;
 public:
  void print();
 // constructor...
}

class Undergrad_Student: public Student {
 private:
  string Major;
 public:
  void print();
  // constructor...
}

在 student.cpp 文件中

bool operator == (const Student& x, const Student& y) {
 if (typeid(x) != typeid(y)) return false;
 else // dosomething..
}

我想比较学生班的孩子;研究生和本科。在 main.cpp 中,当我比较两个学生班级时,它不起作用..

Grad_Student grad1 = Grad_Student("Max", 11, "Hubo");
Student *std1 = &grad1;

Grad_Student grad2 = Grad_Student("Max", 11, "Hubo");
Student *std2 = &grad2;

cout << (std1 == std2) << endl; // it always prints 0.
cout << (*std1 == *std2) << endl; 
// I think this line should work, but makes error.
// error: invalid operands to binary expression ('Student' and 'Student')

我应该在学生课上重载 operator== 吗?给我一个提示...

标签: c++classinheritanceoverloadingabstract

解决方案


所以,你重载的相等运算符什么都不做......你需要比较身体中的一些东西并返回一个boolean结果。

此外,您Undergrad_Student当前不是从Student.. 派生的。此外,由于您正在比较 2 个Student对象,您可以让相等运算符重载一个接受 1 个参数的成员函数。

像这样的东西:

class Student {
public:
    explicit Student( int id )
        : id_{ id }
    { }

    bool operator==( const Student& other ) const {
        return id_ == other.id_;
    }

    virtual void print() const = 0;
    virtual ~Student( ) = default;

protected:
    int id_;
}; 

class Grad: public Student {
public:
    explicit Grad( int id )
        : Student{ id }
    { }

    void print() const override {}
};

class Undergrad : public Student {
public:
    explicit Undergrad( int id )
        : Student{ id }
    { }

    void print() const override {}
};

int main( ) {
    Grad s1{ 11 };
    Undergrad s2{ 12 };

    // Prints false.
    std::cout << std::boolalpha << ( s2 == s1 ) << '\n';

    Grad s3{ 42 };
    Undergrad s4{ 42 };

    // Prints true.
    std::cout << std::boolalpha << ( s3 == s4 ) << '\n';
}

推荐阅读