You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:36:05