虚拟运算符重载c++

isr3a4wc  于 2022-12-05  发布在  其他
关注(0)|答案(4)|浏览(185)

假设我想重载一个派生类的“==”运算符,我是否需要重写派生类头文件中的重载,或者是否有一种方法可以在.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;
}
hsvhsicv

hsvhsicv1#

如果你想在子类中重写一个虚函数,那么你需要在子类中声明函数重写。
因此,是的,需要声明。
你可以这样想:类声明可以在许多地方和许多源文件中使用,否则编译器如何知道函数已被覆盖?

h9a6wy2h

h9a6wy2h2#

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是抽象类。
另请参阅下列术语:

  • 协方差(计算机科学)
  • 反变(计算机科学)
dl5txlt9

dl5txlt93#

正如前面的答案所述,必须在派生类中定义函数。此外,在重写时,应始终使用关键字:override .
在您的示例中,

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

不被覆盖

bool operator==(const B &ref);

即使定义了后者,类B仍然是抽象的。

bool operator==(const B &ref) override;

那么编译器将产生一个错误,通知我们该函数没有覆盖任何内容。

6pp0gazn

6pp0gazn4#

函数必须在派生类中重新声明。否则1)派生类也将是抽象的,并且2)如果一个类的成员函数最初没有在该类中声明,则不能定义它。
请注意,函数声明应如下所示

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

相关问题