在C++中是否可以继承所有运算符?

nhn9ugyo  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(230)

可以使用以下代码继承基类的所有构造函数:

class DerivedClass : public BaseClass {
public:
    using BaseClass::BaseClass;
    ...
};

是否可以以类似的方式继承所有操作符(一行)?
无法编译的特定代码:

#include <string>
#include <memory>

using std::string;

struct A : string
{
    using string::string;
};

int main()
{
    std::shared_ptr<string> str;
    *str = 'a';

    std::shared_ptr<A> a;
    *a = 'a'; // err: E0349 no operator "=" matches these operands

}

如果我像这样编写类,那么上面的代码将编译并运行:

struct A : string
{
    using string::string;
    using string::operator=;
};
omhiaaxx

omhiaaxx1#

所有成员函式(包括运算子多载)都会遵循成员函式的一般继承规则来继承。
就像@sklott提到的,如果函数在派生类中被隐藏(如名称相同,但参数不同等),则需要从基类隐式地拉入函数。
在本例中,默认赋值运算符A隐藏了赋值运算符string,因此必须通过using显式注入这些赋值运算符。

相关问题