Забава мультинаследования указателя C++

Я пишу некоторый код, включающий наследование от основного класса указателя касательно подсчета; и открылась некоторая запутанность C++. Я уменьшил его следующим образом:

Предположим, что я имею:

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

C c;
C* pc = &c;
B* pb = &c;
A* pa = &c;

// does pa point to a valid A object?
// does pb point to a valid B object?

// does pa == pb ?

Кроме того, делает:

// pc == (C*) pa ?
// pc == (C*) pb ?

Спасибо!

10
задан Trent 28 January 2010 в 19:03
поделиться

4 ответа

pc == pa;
pc == pb;

Не определено, зависит от структуры класса.

pc == (C*) pa;
pc == (C*) pb;

Это нормально.

pa == pb;

нет.

Они указывают на действительные объекты?

Yes
1
ответ дан 3 December 2019 в 23:50
поделиться

В настоящее время мы используем BizTalk 2006 в нашей компании для обменивания заказов от экземпляра Commerce Server 2007 и множества магазинов, которые все работают на динамике RMS к нашей главной ERP, Dynamics Nav. BizTalk - это, безусловно, является мощным решением, но я считаю, что кривая обучения довольно крута и согласилась с другими на стойке, которые сказали, что это самый сложный сервер, производимый Microsoft.

Для того, что он делает это твердое вещество, и если бы когда-либо были проблемы с системой, она была на одном конце цепочки или другого, но никогда не с BizTalk.

-121--2416506-

Вызов на Validate () должен работать, хотя может быть достаточным () ; Перекрашивание () не должно потребоваться. Вы можете сравнить то, что вы делаете с этим Примером , который делает динамический GridBaglayout .

-121--3432301-

C Встраивает A и B .

class C: public A, public B {};

очень похоже на C Code Code

struct C {
    A self_a;
    B self_b;
};

и (B *) & C; ; эквивалентно Static_Cast (& C) , аналогична . SEASE_B Если вы использовали прямые C.

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

2
ответ дан 3 December 2019 в 23:50
поделиться
  • Управляет PA на действительный объект?
  • делает PB указывать на действительный объект B?

Да, C * превращается, чтобы PA и PB указывают на правильные адреса.

  • PA == PB?

Нет, обычно нет. Там не может быть объект и b объект на одном адресе.

Кроме того, работает

  • PC == (C *) PA?
  • PC == (C *) Pb?

CAST преобразует указатели обратно на адрес C Объект, поэтому оба равенства верны.

8
ответ дан 3 December 2019 в 23:50
поделиться

Что вы получаете, это что-то подобное в памяти

 ----------
 | A data |
 ----------
 | B data |
 ----------
 | C data |
 ----------

, поэтому, если вы хотите, чтобы весь объект C вы получите указатель на начало памяти. Если вы хотите только «часть», вы получаете тот же адрес, поскольку именно здесь расположены участники данных. Если вы хотите «часть B», вы получаете начало + SizeOf (A) + Sizeof (независимо от компилятора для VTable). Таким образом, в примере, ПК! = Pb (может быть ПК! = PA), но PA никогда не равен Pb.

0
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: