c++多继承的基类派生类指针赋值问题


#include <iostream>
using namespace std;

//基类A
class A{
public:
    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;
}

//中间派生类B
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;
}

//基类C
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;
}

//最终派生类D
class D: public B, public C{
public:
    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){ }
void D::display(){
    cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
}


int main(){
    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;

    return 0;
}

img


继承方式如图
为什么最后地址输出的时候pc出乎意料的和其他不一样

楼主可以买本《C++对象模型》看看
这里只是简单的内存布局而已,看下图

img


把D赋值给C所以C会指向D中C的部分,因为继承的时候B在C前面,所以B*的地址和D开头一样,
C要偏移B的空间大小,B有成员m_a和m_b,也就是8个字节,所以地址多了8

借楼问另一个问题:

class People{
public:
    People(char *name, int age);
   void display();  //声明为虚函数
protected:
    char *m_name;
    int m_age;
};

当new一个people时内存包含display吗

【以下回答由 GPT 生成】

#include <iostream>
using namespace std;

//基类A
class A{
public:
    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;
}

//中间派生类B
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;
}

//基类C
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;
}

//最终派生类D
class D: public B, public C{
public:
    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){ }
void D::display(){
    cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
}


int main() {
    A* ptr1 = new A(1);
    ptr1->display();

    B* ptr2 = new B(2, 3);
    ptr2->display();

    C* ptr3 = new C(4);
    ptr3->display();

    D* ptr4 = new D(5, 6, 7, 8);
    ptr4->display();

    ptr1 = ptr2;
    ptr1->display();

    ptr1 = ptr3;
    ptr1->display();

    ptr1 = ptr4;
    ptr1->display();

    return 0;
}

期望输出:

Class A: m_a=1
Class B: m_a=2, m_b=3
Class C: m_c=4
Class D: m_a=5, m_b=6, m_c=7, m_d=8
Class B: m_a=2, m_b=3
Class C: m_c=4
Class D: m_a=5, m_b=6, m_c=7, m_d=8

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^