假设我想重载一个派生类的“==”运算符,我是否需要重写派生类头文件中的重载,或者是否有一种方法可以在.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条答案
按热度按时间hsvhsicv1#
如果你想在子类中重写一个虚函数,那么你需要在子类中声明函数重写。
因此,是的,需要声明。
你可以这样想:类声明可以在许多地方和许多源文件中使用,否则编译器如何知道函数已被覆盖?
h9a6wy2h2#
C++方法覆写中的函式签章必须完全相符(如果传回型别是指标,则传回型别除外):
如果从A派生的类B没有覆盖在A中声明为
virtual T foo() = 0
的方法,则类B是抽象类。另请参阅下列术语:
dl5txlt93#
正如前面的答案所述,必须在派生类中定义函数。此外,在重写时,应始终使用关键字:
override
.在您的示例中,
不被覆盖
即使定义了后者,类B仍然是抽象的。
那么编译器将产生一个错误,通知我们该函数没有覆盖任何内容。
6pp0gazn4#
函数必须在派生类中重新声明。否则1)派生类也将是抽象的,并且2)如果一个类的成员函数最初没有在该类中声明,则不能定义它。
请注意,函数声明应如下所示