2009-12-03 30 views
0

我使用Visual Studio 2003编译并运行下面的程序。在Visual Studio 2003中交叉铸造的问题

有4个赋值操作,我期望其中2个运行正常,其中2个引发异常。在超载= operator内有一个动态铸件,在非正确的交叉铸造(从AppleOrangeOrangeApple铸造)期间,该铸件预计会失效。但在我的情况下,所有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 */ 
} 
+1

您确定您在VS 2003项目设置中启用了RTTI吗? – AnT 2009-12-03 02:59:34

+1

除了你的问题,你应该总是将赋值运算符的参数声明为const&。即使它没有使用const,用户也不会在它写的分配的右侧产生副作用(例如,你的* fruit [0] = * fruit [1] _could_可以改变* fruit [1]中的任何对象方式): 虚拟无效运算符=(const的水果和水果){..} 只有情况下非const有意义通常是某种“移动”语义.. – Frunsi 2009-12-03 03:42:33

+0

@frunsi - 感谢您的提示;) – Vadakkumpadath 2009-12-03 15:20:40

回答

2

您需要在项目设置中检查Enable Run-time type information (RTTI)。 类别“C++语言”。

在VC6中,至少它不会默认启用。

+0

如果父类没有打开RTTI编译到库中,并且您无法重新编译它,那么您可能运气不佳。 – 2009-12-03 03:16:31

+0

它有效的人...非常感谢aJ .......... :) – Vadakkumpadath 2009-12-03 03:33:08