C++中能否通过一行代码继承基类的全部运算符?
基类构造函数与运算符的继承问题
我们知道,在C++中可以通过以下代码让派生类继承基类的所有构造函数:
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'; // 错误:E0349 没有匹配的运算符"=" }
这段代码里,*a = 'a'会报错,原因是派生类A并没有继承基类string的赋值运算符。
修改后可编译的代码
如果把类A的定义改成如下形式,代码就能正常编译运行:
struct A : string { using string::string; using string::operator=; };
结论
不能通过单一的一行代码继承基类的全部运算符。C++标准里,using Base::Base是针对构造函数的特殊语法,可以一次性引入基类所有构造函数;但对于运算符,并没有类似的批量引入语法,必须针对具体的运算符(比如operator=)单独写using声明,才能让派生类继承对应的运算符重载。
内容的提问来源于stack exchange,提问作者Starodub_A_V
相关产品推荐
相关产品推荐

