проблема приведения от базового указателя к производному - PullRequest
4 голосов
/ 20 января 2020

У меня следующая классовая архитектура:

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;
}

Знаете ли вы какое-либо решение / причину такого поведения? Спасибо.

1 Ответ

0 голосов
/ 03 февраля 2020

Я решил проблему, и это было глупо sh и вызвано моим невниманием. Я должен признать, что архитектура класса была не моей, и где-то в строке деривации было защищенное наследование, о котором я понятия не имел, таким образом, dynamic_cast терпел неудачу (странное поведение от компилятора, потому что в этом определенном файле, где я пытался привести он не жаловался на этот недоступный базовый класс, но в другом файле это сделал, и мне удалось найти проблему).

...