繁体   English   中英

为什么调用基类的赋值运算符?

[英]Why is base class' assignment operator called?

在下面的代码中,我了解到 struct d中的赋值运算符未在derived1 = derived2; 而是生成并调用默认赋值运算符。 但是我对为什么感到困惑:

为什么不在derived1 = derived2;上调用显式d赋值运算符; 当向上转换隐含在b & base2 = derived1
我的猜测是默认的operator= (with header void operator=(const derived& d) )总是生成,除非用完全相同的 header 显式重载并且总是匹配由相同类型的两个变量组成的赋值。 我在正确的道路上吗?

struct b {
   int x;
   void operator=(const b& base) {
      std::cout << "base" << std::endl;
   }
}

struct d: b {
   int y;
   void operator=(const b& base) {
      std::cout << "derived" << std::endl;
   }
}

int main() {
   b base1;
   d derived1;
   d derived2;
   b & base2 = derived1;

   derived1 = base1; // output: "derived"
   derived1 = derived2; // output "base"
}

你的猜测大部分是正确的。 编译器将合成一个定义

void operator=(const d&)

对于派生的 class d (除非它没有被合成,因为它是显式的delete d,或者某些特殊的成员函数是用户定义的)。

这个默认的operator=的行为是它将对参数进行成员复制,并调用其基类的operator= 在这种情况下,该运算符打印“base”,这就是您看到的 output。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM