現在C++で遊んでいるので、問題が発生します。以下のコード:
#include <iostream>
class Base {
public:
virtual ~Base() {}
virtual Base& operator=(const Base& o)
{
std::cout << "Base operator called" << std::endl;
return *this;
}
};
class Derived : public Base {
public:
virtual ~Derived() {}
virtual Base& operator=(const Base& o)
{
std::cout << "Derived operator called" << std::endl;
return *this;
}
};
int main(void)
{
Derived a;
Derived b;
Base& c = a;
Base& d = b;
a = b; // Base called
a = static_cast<Base>(b); // Derived called
a = d; // Derived called
c = d; // Derived called
return (0);
}
コメントは、私が得た出力を示しています。最後の3つの結果は非常に予測可能ですが、最初の結果は理解できません。
2番目の例(static_cast)に示すように、右のオペランドがBaseクラスの場合、Derived ::operator=が呼び出されます。ただし、g ++(4.5.3-r2、gentoo Linux)は、「Base」クラスを使用する必要があることを理解することに成功しましたが、継承ツリーを下っていません。
したがって、Derived :: operator =が呼び出されるか、g ++が「Derived&Derived :: operator =(const Derived&)」がないと文句を言うことを期待していました。誰かが私にこの振る舞いを説明できますか?ありがとう!