我正在学习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
答案 0 :(得分:5)
这是多重继承 - 基类子对象与子实例处于不同的偏移量,因此具有不同的地址。编译器前端必须在隐式upcast期间调整指针值。
答案 1 :(得分:4)
虽然不是完全正确,但您可以将您的复合类视为堆叠在彼此顶部的2个单独对象。您首先声明的那个是顶部(相同的地址),另一个声明为第二个(因此是不同的地址)。
答案 2 :(得分:1)
一个指针指向类的Generator
部分,另一个指针指向Triggerable
部分。它们不能是相同的指针,因为Generator和Triggerable是不同的。
答案 3 :(得分:1)
通过多重继承,不同的基类可以在子对象中具有不同的内存地址。