2012-06-11 3 views
-2

Если у вас есть класс B, который наследуется от класса A, два значения, напечатанные ниже, могут отличаться. Зачем?Различия в наследовании

B *myPointer = new B(); 
A *myOtherPointer = myPointer; 

printf(“%x”, myPointer); 
printf(“%x”, myOtherPointer); 
+2

Woah, не надо. Не спрашивайте об этом в одном вопросе. Сделайте это ... один вопрос на вопрос. Прочитайте [FAQ] (http://stackoverflow.com/faq) и * попробуйте * сначала отвечая на вопрос. Люди помогут, но никто не сделает вам домашнюю работу. –

+0

Что это за «оператор вывода»? Вы ссылаетесь на «<<»? Ха-ха – poitroae

+2

Подождите, черт возьми, мы возьмем эту викторину для него? – SimplyPanda

ответ

2

два значения, напечатанные под могут быть разными. Зачем?

Предполагая, что A является основой B так, что назначение действительно, это не может быть единственной основой B (и, в частности, он не может быть первого основания), и в этом случае будет быть смещение:

struct A { int x; }; 
struct A_ { int y; } 
struct B : A_, A {}; 
int main() { 
    B b; 
    assert(static_cast<void*>(&b) != static_cast<void*>(static_cast<A*>(&b))); 
} 

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

struct A {}; 
struct B : virtual A {}; 
int main() { 
    B b; 
    assert(static_cast<void*>(&b) != static_cast<void*>(static_cast<A*>(&b))); 
} 
+0

Спасибо. Ваш ответ кажется очень продвинутым. Я не видел структуры или виртуального наследования. Не могли бы вы кратко объяснить эти концепции? Я знаю, что struct похожа на класс в C++. – FrozenLand

+0

это дует мой разум. Не указатель всегда указатель? –

+0

'struct' и' class' * почти * синонимы, с той разницей, что спецификатор доступа по умолчанию для 'struct' является общедоступным, а для' class' является закрытым. 'struct B: A_, A {};' эквивалентен более подробному: 'class B: public A_, public A {public:};'. Виртуальное наследование - это совершенно другой зверь, для которого объяснения в комментарии не хватит. Наиболее кратким (неточным) описанием было бы * наследование, когда производный тип захотел разделить базовый подобъект при некоторых обстоятельствах * (вы действительно должны google/читать больше этого) –

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