我已经读过this,但是该讨论仅是关于比较以基类或派生类为参数的运算符。就我而言,我想为完全不同的参数(在这种情况下为std :: string)继承虚拟运算符,而我什至找不到关于该主题的讨论。
所以对于我来说,我有以下代码:
#include <string>
#include <iostream>
class Base {
public:
Base(std::string s) : str(s) {}
virtual bool operator==(const std::string& s) const { return s == str; };
protected:
std::string str;
};
class Derived : public Base {
public:
Derived(std::string s) : Base(s) {}
//bool operator==(const std::string& s) const override { return s == str; };
//bool operator==(const double& d) const { return d == doub; };
protected:
double doub;
};
int main() {
std::string foo = "foo";
Derived object(foo);
if (object == foo)
std::cout << "equal" << std::endl;
}
在这种情况下,正确导出了字符串的运算符(正在编译代码)。但是,如果我想为double类型(取消注释第二个注释)定义另一个运算符,则代码未编译,因为编译器看不到基类中定义的字符串的运算符。取消注释第一条注释,即显式覆盖base的运算符即可。
有人可以解释这种行为吗?
答案 0 :(得分:3)
让我们说你拥有
class Derived : public Base {
public:
Derived(std::string s) : Base(s) {}
bool operator==(const double& d) const { return d == doub; };
protected:
double doub;
};
这里的问题是您的Derived::operator==
函数隐藏 Base::operator==
函数。
这可以通过使用operator==
关键字将Base
类中的Derived
符号拉到using
类中来解决:
class Derived : public Base {
public:
Derived(std::string s) : Base(s) {}
using Base::operator==; // Get the symbol from the Base class into the scope of the Derived class
bool operator==(const double& d) const { return d == doub; };
protected:
double doub;
};