Почему адреса указателей отличаются после апкастинга в C++?
class A
{
public:
A():m_a(111) {}
A(int a);
public:
void display();
protected:
int m_a;
};
A::A(int a): m_a(a) { }
void A::display()
{
cout<<"Class A: m_a="<<m_a<<endl;
}
class B: public A
{
public:
B(int a, int b);
public:
void display();
protected:
int m_b;
};
B::B(int a, int b): A(a), m_b(b) { }
void B::display()
{
cout<<"Class B: m_a="<<m_a<<", m_b="<<m_b<<endl;
}
class C
{
public:
C(int c);
public:
void display();
protected:
int m_c;
};
C::C(int c): m_c(c) { }
void C::display()
{
cout<<"Class C: m_c="<<m_c<<endl;
}
class D: public B, public C
{
public:
int temp;
D():B(1,2),C(3),m_d(4)
{}
D(int a, int b, int c, int d);
public:
void display();
private:
int m_d;
};
D::D(int a, int b, int c, int d): B(a, b), C(c), m_d(d)
{
temp = 0;
}
void D::display()
{
cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
}
A *pa = new A(1);
B *pb = new B(2, 20);
C *pc = new C(3);
D *pd = new D(4, 40, 400, 4000);
pa = pd;
pa -> display();
pb = pd;
pb -> display();
pc = pd;
pc -> display();
cout<<"-----------------------"<<endl;
cout<<"pa="<<pa<<endl;
cout<<"pb="<<pb<<endl;
cout<<"pc="<<pc<<endl;
cout<<"pd="<<pd<<endl;
Я разработал четыре класса. A,B и C являются основными классами, унаследованными D. B является подклассом A. Я просто хочу протестировать апкастинг в C++, поэтому я назначил значение указателя pd для pa b pb и pc. Как видите, я печатаю адреса четырех указателей. Само собой разумеется, что адреса всех указателей одинаковы. Однако pa, pb и pd одинаковы, а pc нет. Почему это?