多继承时的指针偏移和判等问题

代码

#include
using namespace std;

class A {
  public:
    int _b1;
};
class B {
  public:
    int _b2;
};
class C: public A, public B {
  public:
    int _b3;
};

int main() {
    C c;
    A* p1 = &c; 
    B* p2 = &c;
    C* p3 = &c;
    cout << p1 << endl;
    cout << p2 << endl;
    cout << p3 << endl;
    if (p2 == p3) {
        cout << "p2 == p3" << endl;
    }
    return 0;
}

运行结果

多继承时的指针偏移和判等问题_第1张图片

原因

  1. 导致地址不同的原因是在C进行继承时有一个先后顺序(按照代码的编写顺序),他会先继承A类,再继承B类,最后再实现自己的部分,这就导致了C的对象模型中B类是在中间位置的,ptr1指向了C对象中A的位置,ptr2指向了C对象中B的位置,编译器取的时候进行指针偏移,从而导致了地址不同。
  2. 当判断 ‘==’ 时,会分析两个地址是不是指向了同一个实例对象,如果是,就会做隐式的类型转换 ,然后再判等(虽然地址不同但指向的是同一个实例对象)

所以可以看到,C++中的多继承其实是一个缺陷,后来的Java中取消了多继承。具体的探究学习《深度探索C++对象模型》

你可能感兴趣的:(C++,c++)