关于多重继承时继承顺序的一点体会

今天看程序员面试宝典(第三版时)时,看到一个关于多重继承的问题。题目如下

#include
using namespace std;

class A
{
int a;
};
class B 
{
int b;
};
class C : public  A, public B
{
int c;
};
 
int main()
{

C * pc = new C;
B * pb = dynamic_cast(pc);
A * pa = dynamic_cast(pc);

if(pc == pb)
    {
cout << "equal" << endl;
    }  
    else
    {
          cout << "not equal" << endl;
    }
    if((int)pc == (int )pb)
    {
          cout << "equal" << endl;
   
    else
    {
          cout << "not equal" << endl;
    }
cout << "pa : " << pa << endl;
cout << "pb : " << pb << endl;
cout << "pc : " << pc << endl;
cout << "(int)pa : " << (int)pa << endl;
cout << "(int)pb : " << (int)pb << endl;
cout << "(int)pc : " << (int)pc << endl;

      return 0;

}

C的继承顺序若是先A后B,用vs2010测试后,结果如下:


可以看到,pa和pc值是相同的,pb前进了4个字节,这里我是这么理解的,C的继承顺序是先A后B,故C的数据成员在内存中的排序应该是a,b,c,pc指向a的位置,pb应该指向b的位置,pa也指向a的位置,这里可以通过变换C继承的顺序来证明,若C的继承顺序是先B后A,结果如下:


在dev c++下的测试结果,可以看到pb和pc的指向内存地址是相同的。


再来看看两个比较的问题。继承顺序是先A后B时,pb和pc指向的内存地址不同,但是为何第一个if语句(即pc == pb)的结果输出时equal咧?

pc == pb比较的到底是什么呢?

按照面试宝典上的解释,比较的是pc指向的对象和(C*)隐式转换pb后pb指向的对象(pc指向的对象)的部分,指向的是同一个部分,这里倒不是很明白,希望谁看到了可以给我解释一下。

这里写这个主要是明白了一个东西,多重继承时,继承的顺序不同,继承来的东西在子类中的存储顺序也会跟着不同,同时各父类指针发生这种强制转换时指向的地址也是按照这个排序来确定的。

你可能感兴趣的:(关于多重继承时继承顺序的一点体会)