虚拟运算符重载c ++

时间:2015-06-04 08:23:17

标签: c++ oop inheritance operator-overloading

假设我想重载" =="对于派生类的运算符,我是否需要重写派生类头文件中的重载,或者有没有办法在.cpp文件中实现运算符重载而不必在头文件中添加任何内容?如果是这样,派生运算符的实现如何在.cpp?

中看起来像

我的标题是什么样的:

class A
{
    public:
    A();
    ~A();
    virtual bool operator==(const A &ref) = 0;
    protected:
    int year;
    string note;
}
class B:A
{
    public:
    B();
    ~B();
    bool operator==(const B &ref); //is this needed or not?
    private:

    int month, day;
}

4 个答案:

答案 0 :(得分:4)

如果要覆盖子类中的虚函数,则需要在子类中声明函数覆盖。

是的,需要声明。

以这种方式思考:类声明可以在很多地方和许多源文件中使用,编译器如何知道该函数已被覆盖?

答案 1 :(得分:2)

如先前的回答所述,您必须在派生类中定义函数。同样,在覆盖时,应始终使用关键字:(?P<client>.+?)\s(?P<domain>.+?)\s{(?P<content>[\w\W\s]+?)(?P<close>^})

在您的示例中,

override

不会被

覆盖
virtual bool operator==(const A &ref) = 0;

即使定义后者,类B仍将是抽象的。如果B中的bool operator==(const B &ref); 被声明为

operator==

然后,编译器将产生一个错误,通知我们该函数未覆盖任何内容。

答案 2 :(得分:1)

该函数必须在派生类中重新声明。否则1)派生类也将是抽象的; 2)如果没有在该类中首次声明它,则可能无法定义类的成员函数。

考虑到函数声明应该是

virtual bool operator==(const A &ref) const = 0;
                                      ^^^^^ 

答案 3 :(得分:0)

C ++方法重写中的函数签名必须完全匹配(如果返回类型是指针,则返回类型除外):

         class A { ... };
         class B : A { ... };
class A: virtual bool operator==(const A &ref) = 0;
class B:         bool operator==(const A &ref) override; // OK
class B:         bool operator==(const B &ref) override; // Invalid

如果派生自A的类B没有覆盖在A中声明为virtual T foo() = 0的方法,则类B是抽象类。

另请参阅以下条款:

  • 协方差(计算机科学)
  • 矛盾(计算机科学)