C++:为派生类型继承基类中定义的const赋值运算符

问题描述 投票:0回答:1

很多很多关于继承

operator=
的帖子,通常的答案是“它被隐式定义的继承所掩盖,如果你知道自己在做什么,请使用
using Base::operator=
”。

这是一个希望略有不同的问题。 考虑以下情况,其中基类

A
知道派生类的确切类型:

#include <iostream>

template <typename E>
struct A {
    E& operator= (const E& other) {
      std::cout << "A<E>::op=\n";
      return *(E*)this;
    }

    E& operator= (E& other) {
      std::cout << "A<E>::op no const=\n";
      return *(E*)this;
    }
};

struct B : public A<B> {
    using A<B>::operator=;
};

int main () {
  B x, y;
  x = y;
  const B z;
  x = z;
}

main
函数中,当调用
x = y
时,会调用带有
E& A<E>::operator= (E& other)
的方法
E = B
,正如预期的那样。 但是,
x = z
会调用
E& A<E>::operator= (const E& other)

为什么? (请注意,这是一个关于行为的问题,而不是风格的问题:-))

c++ templates inheritance assignment-operator
1个回答
0
投票

为什么?

因为

x = z
使用了隐式定义的

B& B::operator=(const B&)

A& A::operator=(const A&)
© www.soinside.com 2019 - 2024. All rights reserved.