代码
#include<iostream>
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;
}
运行结果
原因
- 导致地址不同的原因是在C进行继承时有一个先后顺序(按照代码的编写顺序),他会先继承A类,再继承B类,最后再实现自己的部分,这就导致了C的对象模型中B类是在中间位置的,ptr1指向了C对象中A的位置,ptr2指向了C对象中B的位置,编译器取的时候进行指针偏移,从而导致了地址不同。
- 当判断 ‘==’ 时,会分析两个地址是不是指向了同一个实例对象,如果是,就会做隐式的类型转换 ,然后再判等(虽然地址不同但指向的是同一个实例对象)
所以可以看到,C++中的多继承其实是一个缺陷,后来的Java中取消了多继承。具体的探究学习《深度探索C++对象模型》