提问者:小点点

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


在下面的代码中,我知道结构d中的赋值运算符不是在derived1=derived2;上调用的,而是生成和调用默认的赋值运算符。 然而,我不明白为什么:

b&code>中隐式向上转播时,为什么不对derived1=derived2调用显式d赋值运算符 base2=derived1
我的猜测是,默认的operator=(with headervoid operator=(const derived&d))总是生成,除非用完全相同的头显式重载,并且总是与由两个相同类型的变量组成的赋值相匹配。 我走的路对吗?

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"
}

共1个答案

匿名用户

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

void operator=(const d&)

用于派生类d。 (除非它是显式的deleted而不是合成的,或者某些特殊的成员函数是用户定义的)。

这个默认的operator=具有这样的行为:它将执行参数的成员复制,并且还调用其基类的operator=。 在本例中,运算符打印“base”,这就是您所看到的输出。