C ++: приведение моего объекта к другому суперклассу приводит к другому адресу указателя - PullRequest
2 голосов
/ 18 января 2011

Я изучаю C ++, пытаюсь написать хороший, полиморфный код и прибегаю к некоторой путанице.У меня есть класс Er_1Sine, который имеет два суперкласса: «Генератор» и «Триггерный».

Er_1Sine выглядит следующим образом:

class Er_1Sine : public Generator, public Triggerable{

}

Если я создаю указатель «Генератор» (gen), устанавливая его в «er1», адрес указателя соответствует адресу «er1».Однако адрес моего указателя «Triggerable», «trig», не совпадает.Что тут происходит?trig не указывает на тот же объект, что и er1 и gen?

er1 = new Er_1Sine();   
Generator *gen = er1;
Triggerable *trig = er1;

printf("\n\n er1 as Er_1Sine: %p \n", er1);
// outputs: "er1 as Er_1Sine: 0x4d28920"

printf("er1 as Generator address: %p \n", gen);
// outputs: "er1 as Generator address: 0x4d28920"   

printf("er1 as Triggerable address: %p \n\n", trig);
// outputs: er1 as Triggerable address: 0x4d289f8

Ответы [ 4 ]

5 голосов
/ 18 января 2011

Это множественное наследование - подобъекты базового класса находятся в разных смещениях в пределах дочернего экземпляра, таким образом, разные адреса.Это внешний интерфейс компилятора, который должен корректировать значения указателя во время неявных повышений.

4 голосов
/ 18 января 2011

хотя и не полностью правильно, вы можете думать о своем составном классе как о двух отдельных объектах, расположенных друг над другом.Тот, который вы объявили первым, является верхним (тот же адрес), а другой - вторым (отсюда и другой адрес).

1 голос
/ 18 января 2011

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

1 голос
/ 18 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...