【问题标题】:casting problem from base pointer to derived从基指针到派生的转换问题
【发布时间】:2020-05-06 12:04:40
【问题描述】:

我有以下类架构:

class A{
  public:
      A() {}
      virtual ~A() {}
      void printA() { cout << "A" << endl; }
};
class B{
  public:
      B() {}
      virtual ~B() {}
      void printB() { cout << "B" << endl; }
};
class C : public A{
    public:
        C() : A() {}
        virtual ~C() {}
        void printC() { cout << "C" << endl; }
};
class D : public B{
    public:
        D() : B() {}
        virtual ~D() {}
        void printD() { cout << "D" << endl; }
};
class P: public C, public D{
    public:
        P() : C(), D() {}
        ~P() {}
        void printP() { cout << "P" << endl; }
};

问题在于,在 Visual Studio 中某些转换失败,但在在线编译器中一切正常。我将在代码中更好地解释问题:

    A* pObject= new P(); // let s say I have this instance of type P referenced by an A type pointer
    dynamic_cast<P*>(pObject)->printP(); // works fine in both VS and online compiler, as expected
    dynamic_cast<D*>(pObject)->printD(); // THIS IS THE PROBLEM, in Visual Studio cast returns nullptr, but in online compiler works fine.
    return 0;
}

您知道这种行为的任何解决方案/原因吗?谢谢。

【问题讨论】:

  • 标签已被删除,但你的代码中没有菱形问题。 P 每个基只继承一次
  • @foreknownas_463035818 我没有说有钻石问题。我没有钻石问题。问题在于铸造。请再次阅读我的问题。与钻石问题无关。
  • 您是否在 Visual Studio 项目配置中禁用了 RTTI?
  • 根据cppreference(这里称为“side-cast”)和msvc docs(这里称为cross-cast),您的代码都是正确的。一定是一些编译器问题(根据 SO 中关于 MSVC 的问题数量,这很常见)

标签: c++ casting dynamic-cast


【解决方案1】:

我解决了这个问题,这很愚蠢,是由于我缺乏注意力造成的。我不得不承认,类架构不是我的,并且在派生线上的某个地方有一个我不知道的受保护继承,因此 dynamic_cast 失败(编译器的奇怪行为,因为在那个我试图强制转换的文件中它并没有抱怨这个无法访问的基类,而是在另一个文件中它做到了,我设法找到了问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多