C ++:将我的对象转换为不同的超类会导致不同的指针地址

时间:2011-01-17 22:53:55

标签: c++ inheritance pointers polymorphism

我正在学习C ++,试图编写好的,多态的代码,然后遇到一些困惑。我有一个Er_1Sine类,它有两个超类:“Generator”和“Triggerable”。

Er_1Sine看起来像这样:

class Er_1Sine : public Generator, public Triggerable{

}

如果我创建一个“Generator”指针(gen),将其设置为“er1”,则指针地址与“er1”的地址匹配。但是,我的“可触发”指针“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 个答案:

答案 0 :(得分:5)

这是多重继承 - 基类子对象与子实例处于不同的偏移量,因此具有不同的地址。编译器前端必须在隐式upcast期间调整指针值。

答案 1 :(得分:4)

虽然不是完全正确,但您可以将您的复合类视为堆叠在彼此顶部的2个单独对象。您首先声明的那个是顶部(相同的地址),另一个声明为第二个(因此是不同的地址)。

答案 2 :(得分:1)

一个指针指向类的Generator部分,另一个指针指向Triggerable部分。它们不能是相同的指针,因为Generator和Triggerable是不同的。

答案 3 :(得分:1)

通过多重继承,不同的基类可以在子对象中具有不同的内存地址。