Я пишу некоторый код, включающий наследование от основного класса указателя касательно подсчета; и открылась некоторая запутанность 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 ?
Спасибо!
pc == pa;
pc == pb;
Не определено, зависит от структуры класса.
pc == (C*) pa;
pc == (C*) pb;
Это нормально.
pa == pb;
нет.
Они указывают на действительные объекты?
Yes
В настоящее время мы используем BizTalk 2006 в нашей компании для обменивания заказов от экземпляра Commerce Server 2007 и множества магазинов, которые все работают на динамике RMS к нашей главной ERP, Dynamics Nav. BizTalk - это, безусловно, является мощным решением, но я считаю, что кривая обучения довольно крута и согласилась с другими на стойке, которые сказали, что это самый сложный сервер, производимый Microsoft.
Для того, что он делает это твердое вещество, и если бы когда-либо были проблемы с системой, она была на одном конце цепочки или другого, но никогда не с BizTalk.
-121--2416506- Вызов на Validate ()
должен работать, хотя может быть достаточным ()
; Перекрашивание ()
не должно потребоваться. Вы можете сравнить то, что вы делаете с этим Примером , который делает динамический GridBaglayout
.
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.
в целом, вы не можете полагаться на указатели на разные типы взаимозаменяемыми или сопоставимыми.
- Управляет PA на действительный объект?
- делает PB указывать на действительный объект B?
Да, C *
превращается, чтобы PA
и PB
указывают на правильные адреса.
- PA == PB?
Нет, обычно нет. Там не может быть объект
и b
объект на одном адресе.
Кроме того, работает
- PC == (C *) PA?
- PC == (C *) Pb?
CAST преобразует указатели обратно на адрес C
Объект, поэтому оба равенства верны.
Что вы получаете, это что-то подобное в памяти
----------
| A data |
----------
| B data |
----------
| C data |
----------
, поэтому, если вы хотите, чтобы весь объект C вы получите указатель на начало памяти. Если вы хотите только «часть», вы получаете тот же адрес, поскольку именно здесь расположены участники данных. Если вы хотите «часть B», вы получаете начало + SizeOf (A) + Sizeof (независимо от компилятора для VTable). Таким образом, в примере, ПК! = Pb (может быть ПК! = PA), но PA никогда не равен Pb.