Указатель на базовый класс - PullRequest
0 голосов
/ 01 ноября 2010

Если у меня есть следующие классы:

class A
{
    ...
}

class B
{
    ...
}

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

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

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

код

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

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

1 голос
/ 01 ноября 2010

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

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

Единственный способ приведения к иерархии наследования - использовать dynamic_cast, для которого требуется, чтобы тип был полиморфным (т. Е. Ваш класс должен иметь хотя бы одну виртуальную функцию-член; , поскольку деструкторы базового класса быть virtual, это обычно не проблема):

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

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

1 голос
/ 01 ноября 2010

Если 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
}
...