#include <iostream>
class aa
{
public:
aa(){}
aa(aa& obj)
{
aa1 = obj.aa1;
}
virtual aa operator =(aa& obj)
{
aa1 = obj.aa1;
return (*this);
}
virtual aa operator +(aa& obj)
{
aa1 += obj.aa1;
return (*this);
}
int aa1;
};
class bb: public aa
{
public:
bb():aa(){}
bb(bb& obj)
{
bb1 = obj.bb1;
}
aa operator =(aa& obj)
{
aa::operator =(obj);
bb b1 = dynamic_cast<bb&>(obj);
bb1 = b1.bb1;
return (*this);
}
aa operator +(aa& obj)
{
aa::operator +(obj);
bb b1 = dynamic_cast<bb&>(obj);
bb1 += b1.bb1;
return (*this);
}
int bb1;
};
int main()
{
bb b1;
bb b2;
b1.bb1 = 1;
b1.aa1 = 1;
b2.bb1 = 2;
b2.aa1 = 2;
aa &a1 = b1;
aa &a2 = b2;
a1 = a2;
b1 = dynamic_cast<bb&>(a1);
b2 = dynamic_cast<bb&>(a2);
std::cout<<b1.aa1<<";"<<b1.bb1;
bb b3;
b3.bb1 = 3;
b3.aa1 = 3;
aa &a3 = b3;
aa &a4 = a2 + a3;
b3 = dynamic_cast<bb&>(a4);
return 0;
}
出力:
2;2
そしてb3 = dynamic_cast<bb&>(a4);
、エラーを与える行でクラッシュしますstd::bad_cast at memory location 0x0012fdbc..
私が見つけた理由は、a2 + a3 の式の結果が aa 型のオブジェクトとして来ており、次のステートメントで、それを有効でない派生型オブジェクトにキャストしようとしているため、例外が発生するためです。aa &a4 = a2 + a3;
したがって、私の質問は、上記の機能にいくつかの変更を加えることで、上記の意図を達成できるかということです。