boost :: dynamic_pointer_cast возвращает ноль при правильном приведении - PullRequest
0 голосов
/ 22 октября 2010

Я использую boost :: shared_ptr и boost :: dynamic_pointer_cast. У меня есть базовый класс, интерфейс, который наследуется от этого базового класса, а затем класс, который наследует от этого.

Итак A -> B -> C. Я создаю объект типа C, и он сохраняется как shared_ptr типа A. Затем я пытаюсь сделать dynamic_pointer_cast для типа B, но boost :: dynamic_pointer_cast возвращает NULL.

Когда я делаю boost :: static_pointer_cast и использую указатель, это не приводит к сбою программы. Но я бы предпочел, чтобы динамический состав работал.

Почему это происходит?

РЕДАКТИРОВАТЬ: Вот компактный раздел кода (в противном случае это слишком долго, чтобы положить здесь). Скажите, если вам нужно больше, чем файлы заголовков.

class A
{
public:
    virtual ~A();

    /** Contains other virtual functions and some static functions */

protected:
    A();
};

class B
{
public:
    /** Pure virtual functions */

    /** Note: No destructor is declared (when I next have
        access to the computer I'll try adding a virtual destructor) */

protected:
    B();
};

class C
{
public:
    C();

    virtual ~C();

    /** Implementation of pure virtual functions */
};

Кроме того, dynamic_pointer_cast для этого же кода работает на другом компьютере с точно такими же классами. Который имеет меня в полной растерянности. Код также работал до недели назад, когда я внес изменения. Когда я отменил изменение, проблема все еще возникала.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Некоторый код поможет. Первое очевидное предположение состоит в том, что, возможно, вы забыли дать виртуальному деструктору A.

0 голосов
/ 22 октября 2010

Трудно сказать без ваших определений A, B и C вместе с вашим использованием.

Сравните вашу программу со следующим:

#include <boost/shared_ptr.hpp>
#include <iostream>

struct A { virtual ~A() {} };
struct B : A {};
struct C : B {};

int main()
{
    boost::shared_ptr<A> x(new C);
    boost::shared_ptr<B> y(boost::dynamic_pointer_cast<B>(x));

    std::cout << std::boolalpha
                << (y.get() != 0) << std::endl;
}
...