2010-11-01 3 views
0

Если у меня есть следующие классы:Указатель на базовый класс

class A 
{ 
    ... 
} 

class B 
{ 
    ... 
} 

class C : public A, public B 
{ 
    ... 
} 

и где-то я обнаруживаю, что указатель класса B, что у меня есть на самом деле указывает на класс C, но функция требует указатель на класс A , что я могу сделать, чтобы получить этот указатель на класс A?

+0

Оставьте свой код. C уже является A, поэтому его не нужно отличать. –

+0

Странно. Не могли бы вы скопировать реальный код? – tibur

+0

Извините, ребята, я перепутался, теперь я отправил настоящую проблему – wrongusername

ответ

1

Если вы знаете наверняка, что у вас есть B*, что указывает на C объекта, вы можете использовать пару static_cast с:

B* bp = new C(); 
C* cp = static_cast<C*>(bp); 
A* ap = static_cast<A*>(cp); 

Единственный способ бросить по иерархии наследования является использование dynamic_cast , который требует, чтобы тип полиморфный (то есть, ваш класс должен иметь по крайней мере одну виртуальную функцию-член, since your base class destructors should be virtual, это обычно не проблема):

B* bp = new C(); 
A* ap = dynamic_cast<A*>(bp); 

dynamic_cast имеет дополнительную выгоду, если он не работает (то есть, если bp на самом деле не указывает на C), он возвращает NULL. У этого недостатка есть небольшая стоимость исполнения (static_cast фактически свободна во время выполнения).

+0

Спасибо! Это скомпилировано :) – wrongusername

1

Если C наследует от A, как вы показали, то указатель C * должен быть неявно преобразован в указатель A *. Возможно ли, что вы не включили объявление класса C, чтобы компилятор не знал об этом отношении наследования? Или что на самом деле существуют разные отношения наследования, чем в вашем вопросе? Некоторый код был бы полезен при диагностике этой проблемы.

Редактировать
на основе обновленной версии вашего вопроса:

// Converts b to type A*, but only if it is actually 
// of type C; otherwise, returns NULL 
A* convertBtoAviaC(B* b) { 
    C* c = dynamic_cast<C*>(b); 
    return c; // note may be NULL, if b is not a C 
} 
+0

Oh! Я просто дважды проверял. Да, есть разные отношения наследования ... Я обновлю вопрос – wrongusername

1

Кодекса

class A 
{ 
}; 
class B 
{ 
}; 
class C : public A, public B 
{ 
}; 
int main() { 
    C c; 
    A *a = &c; 
} 

действует с С уже А, так что присваивание является действительным.

 Смежные вопросы

  • Нет связанных вопросов^_^