C++赋值运算符是否会被派生类继承?代码运行结果疑问
问题解答
认知偏差的核心原因
你混淆了两个完全独立的C++语法规则:默认拷贝赋值运算符的执行逻辑,和赋值运算符的继承规则。你看到的基类赋值运算符被调用,是前者的效果,和后者没有关系。
1. 输出Base operator=的实际原因
你没有为派生类D显式定义拷贝赋值运算符,所以编译器会为D自动生成默认的拷贝赋值运算符,它的固定执行逻辑如下:
- 第一步:调用直接基类的拷贝赋值运算符,处理基类子对象的数据
- 第二步:按成员声明顺序,依次调用派生类自身非静态成员的拷贝赋值运算符
你代码里a = b走的是D的默认拷贝赋值逻辑,它内部调用了基类B的operator=,才会打印对应的日志,并不是派生类直接继承了基类的赋值运算符来执行。
2. 为什么说赋值运算符不会被派生类继承
C++的名字查找规则规定:派生类如果隐式/显式声明了自己的赋值运算符(编译器默认生成的也算),会把基类中所有同名的operator=函数全部隐藏,基类的赋值运算符在派生类作用域中不可见,自然不能被直接调用。
你可以用如下代码验证:
int main() { B b_obj; D d_obj; // 下面这行代码会编译报错:没有匹配的D::operator=(const B&) // 如果赋值运算符真的被继承,这行应该能成功调用基类的B::operator=(const B&) // d_obj = b_obj; return 0; }
放开注释后编译失败,就可以证明基类的赋值运算符并没有被派生类继承使用。
内容的提问来源于stack exchange,提问作者user16188058
相关产品推荐
相关产品推荐

