假设我想重载" =="对于派生类的运算符,我是否需要重写派生类头文件中的重载,或者有没有办法在.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;
}
答案 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是抽象类。
另请参阅以下条款: