我使用Visual Studio 2003
编译并运行下面的程序。在Visual Studio 2003中交叉铸造的问题
有4个赋值操作,我期望其中2个运行正常,其中2个引发异常。在超载= operator
内有一个动态铸件,在非正确的交叉铸造(从Apple
到Orange
或Orange
到Apple
铸造)期间,该铸件预计会失效。但在我的情况下,所有4个操作都失败了(引发异常)。我已在Visual Studio 2008
中运行相同的代码,并且按预期工作正常。但是将整个项目移至Visual Studio 2008
很困难。这是Visual Studio 2003
的问题吗?如果是这样,有什么方法可以解决这个问题吗?
注意:类Fruit
是只读的,不能更改。
class Fruit
{
public:
virtual void operator = (const Fruit& fruit)
{
}
};
class Apple : public Fruit
{
public:
virtual void operator = (const Fruit& fruit)
{
Apple& apple = dynamic_cast<Apple&>(fruit);
}
};
class Mango : public Fruit
{
public:
virtual void operator = (const Fruit& fruit)
{
Mango& mango = dynamic_cast<Mango&>(fruit);
}
};
int main(void)
{
Apple apple;
Mango mango;
Fruit* fruit[] = { &apple, &mango };
*fruit[0] = *fruit[0]; /* Expect to work ok */
*fruit[0] = *fruit[1]; /* Expect an exception */
*fruit[1] = *fruit[0]; /* Expect an exception */
*fruit[1] = *fruit[1]; /* Expect to work ok */
}
您确定您在VS 2003项目设置中启用了RTTI吗? – AnT 2009-12-03 02:59:34
除了你的问题,你应该总是将赋值运算符的参数声明为const&。即使它没有使用const,用户也不会在它写的分配的右侧产生副作用(例如,你的* fruit [0] = * fruit [1] _could_可以改变* fruit [1]中的任何对象方式): 虚拟无效运算符=(const的水果和水果){..} 只有情况下非const有意义通常是某种“移动”语义.. – Frunsi 2009-12-03 03:42:33
@frunsi - 感谢您的提示;) – Vadakkumpadath 2009-12-03 15:20:40