2011-12-08 2 views
1

Если у меня есть эта структура классов:static_cast между «несвязанными типами»

class A 
{ 
public: 
    int a; 
    void funcA(){a = 0;} 
}; 

class B 
{ 
public: 
    int b; 
    void funcB(){b = 0;} 
}; 

class C: public A, public B 
{ 
public: 
    int c; 
    void funcC(){c = 0;} 
}; 

Почему я могу выполнить этот бросок?

A* pA = new A; 

C* pC = static_cast<C*> (pA); 
B* pB = static_cast<B*> (pC); 

pB->funcB(); 

A и B не связаны, не так ли?

+5

Эта последовательность отливок будет прекрасной, если вы начали с 'A * pA = new C;'. Таким образом, ни язык, ни компилятор не прекратят делать их: проблема заключается не в приведениях, а в качестве значения ввода. –

+0

Приведение из 'pA' в' C * 'уже не определено. – fefe

+0

Здесь нет «проблемы», мне было интересно, почему это допустимо. Компилятор * остановил бы меня, если бы классы не были в одной иерархии, да? Я предположил, что актерский состав от pA до C * был ОК, так как C получен из A. – QuoVadis

ответ

5

Они могут быть несвязанными, но компилятор здесь не делает диалоги между листами.

Он просто говорит: «О, C - производный класс A, это законно, насколько я знаю».
В следующей строке говорится: «О, B является базовым классом C, это законно, насколько я знаю».
И вот об этом. В вашем случае C ссылки A и B между литьями.

+3

ОК, спасибо. Отсюда «небезопасная» репутация? – QuoVadis

+3

@Quo: C++ просто дает вам достаточно веревки, чтобы повесить себя. Это зависит от вас, как правильно использовать его. – Xeo

+3

@Quo: Или, другими словами, ** C++ не ваша няня **. – Xeo

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

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