Здравствуйте, 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) не требует преобразований.