Re: dynamic_cast при множественном наследовании
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 25.03.06 13:00
Оценка: 1 (1)
Здравствуйте, Steven_Orko, Вы писали:


S_O>

S_O>class classC : public classA, public classB
S_O>{
S_O>public:
S_O>    classC()
S_O>    {
S_O>        printf("Initial classC\n");
S_O>    };
S_O>    virtual ~classC() 
S_O>    {
S_O>        printf("destruct classC\n");
S_O>    };
S_O>};
S_O>
dynamic_cast при множественном наследовании
От: Steven_Orko  
Дата: 25.03.06 11:13
Оценка:
Поясните, плиз, новичку следующий вопрос.
Имеется код трех классов:
class classA
{
public:
    classA() 
    {
        printf("initial classA\n");
    };
    virtual ~classA() 
    {
        printf("destruct classA\n");
    };

};

class classB
{
public:
    classB()
    {
        printf("initial classB\n");
    }
    virtual ~classB() 
    {
        printf("destruct classB\n");
    };
    void prinf()
    {
        printf("test dynamic_cast\n");
    }
};

class classC : public classA, classB
{
public:
    classC()
    {
        printf("Initial classC\n");
    };
    virtual ~classC() 
    {
        printf("destruct classC\n");
    };
};


В проге я хочу иметь массив указателей на объекты класса classC, но при этом вариации класса classC могут быть разные. Т.е. может быть несколько классов, унаследованных от classA, classB. При этом хочу иметь возможности вызывать методы, унаследованные от обоих классов. Проблемма в том, что, когда я пытаюсь преобразовать указатель на classС к указателю на classA или classB, компилятор выдает ошибку: "dynamic_cast used to convert to inaccessible or ambiguous base; run-time test will fail ('classC *' to 'classB *')" при dynamic_cast. Вот код:

int _tmain(int argc, _TCHAR* argv[])
{
    classC* pCItem = new classC();
    classB* pBItem = dynamic_cast<classB*>(pCItem);
    if (NULL != pBItem) pBItem->prinf();
    delete pCItem;

    return 0;
}


Посоветуйте, как лучше решить данную проблемму?
Re: dynamic_cast при множественном наследовании
От: _nn_  
Дата: 25.03.06 11:24
Оценка:
Здравствуйте, Steven_Orko, Вы писали:

S_O>Поясните, плиз, новичку следующий вопрос.

S_O>Имеется код трех классов:
S_O>
S_O>class classA
S_O>{
S_O>public:
S_O>    classA() 
S_O>    {
S_O>        printf("initial classA\n");
S_O>    };
S_O>    virtual ~classA() 
S_O>    {
S_O>        printf("destruct classA\n");
S_O>    };

S_O>};

S_O>class classB
S_O>{
S_O>public:
S_O>    classB()
S_O>    {
S_O>        printf("initial classB\n");
S_O>    }
S_O>    virtual ~classB() 
S_O>    {
S_O>        printf("destruct classB\n");
S_O>    };
S_O>    void prinf()
S_O>    {
S_O>        printf("test dynamic_cast\n");
S_O>    }
S_O>};

S_O>class classC : public classA, classB
S_O>{
S_O>public:
S_O>    classC()
S_O>    {
S_O>        printf("Initial classC\n");
S_O>    };
S_O>    virtual ~classC() 
S_O>    {
S_O>        printf("destruct classC\n");
S_O>    };
S_O>};
S_O>


S_O>В проге я хочу иметь массив указателей на объекты класса classC, но при этом вариации класса classC могут быть разные. Т.е. может быть несколько классов, унаследованных от classA, classB. При этом хочу иметь возможности вызывать методы, унаследованные от обоих классов. Проблемма в том, что, когда я пытаюсь преобразовать указатель на classС к указателю на classA или classB, компилятор выдает ошибку: "dynamic_cast used to convert to inaccessible or ambiguous base; run-time test will fail ('classC *' to 'classB *')" при dynamic_cast. Вот код:


S_O>
S_O>int _tmain(int argc, _TCHAR* argv[])
S_O>{
S_O>    classC* pCItem = new classC();
S_O>    classB* pBItem = dynamic_cast<classB*>(pCItem);
S_O>    if (NULL != pBItem) pBItem->prinf();
S_O>    delete pCItem;

S_O>    return 0;
S_O>}
S_O>


S_O>Посоветуйте, как лучше решить данную проблемму?


В данном примере не нужен dynamic_cast.
Преобразование от предка к родителю (up-cast) не требует преобразований.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.