C++ 对象——对象中的 this 指针调整

C++ 对象中的 this 指针调整

1. 背景
  • 在多重继承中,一个对象可能同时包含多个基类的成员。this 指针的调整是为了确保在调用成员函数时,能够正确访问当前对象的基类部分。
2. 示例代码
#include <iostream>

class A {
public:
    int a;
    A() {
        std::cout << "A::A(), this = " << this << std::endl;
    }
    void funcA() {
        std::cout << "A::funcA(), this = " << this << std::endl;
    }
};

class B {
public:
    int b;
    B() {
        std::cout << "B::B(), this = " << this << std::endl;
    }
    void funcB() {
        std::cout << "B::funcB(), this = " << this << std::endl;
    }
};

class C : public A, public B {
public:
    int c;
    C() {
        std::cout << "C::C(), this = " << this << std::endl;
    }
    void funcC() {
        std::cout << "C::funcC(), this = " << this << std::endl;
    }
};

int main() {
    std::cout << sizeof(A) << std::endl; // 4
    std::cout << sizeof(B) << std::endl; // 4
    std::cout << sizeof(C) << std::endl; // 12 (4 + 4 + 4)

    C myc;
    myc.funcA(); // 调用 A 的成员函数
    myc.funcB(); // 调用 C 中的成员函数
    myc.funcC(); // 调用 C 的成员函数

    return 0;
}
/* 控制台输出
4
4
12
A::A(), this = 0x6bfe44
B::B(), this = 0x6bfe48
C::C(), this = 0x6bfe44
A::funcA(), this = 0x6bfe44
B::funcB(), this = 0x6bfe48
C::funcC(), this = 0x6bfe44
*/
3. 输出分析
  • 对象大小:

    • sizeof(A) 输出 4,表示类 A 的大小。
    • sizeof(B) 输出 4,表示类 B 的大小。
    • sizeof(C) 输出 12,表示类 C 的大小(包含 A 和 B 的成员)。
  • 构造函数输出:

    • 每个类的构造函数输出 this 指针的值,显示当前对象的地址。

      例如,A::A(), this = 0x6bfe44 表示 A 部分的 this 指针。

  • 成员函数调用:

    • myc.funcA() 调用 A 的成员函数,this 指针指向 C 对象的 A 部分。
    • myc.funcB() 调用 C 中的重载 funcB()this 指针指向 C 对象的 B 部分。
    • myc.B::funcB() 调用 B 的成员函数,this 指针指向 B 部分的地址。
    • myc.funcC() 调用 C 的成员函数,this 指针指向 C 对象。
4. this 指针调整
  • 当调用成员函数时,编译器会根据成员函数的类型自动调整 this 指针,以确保指向正确的基类部分。

  • 在多重继承中,this 指针的调整机制确保了每个基类部分的成员函数能够正确访问其对应的对象部分。

    例如,调用 B::funcB() 时,this 指针会被调整为指向 C 对象的 B 部分,而不是 A 部分。

5. 总结
  • this 指针在多重继承中非常重要,它确保成员函数可以正确访问所属的基类部分。

    调用哪个子类的成员函数,这个 this 指针就会被编译器自动调整到对象内存布局中对应该类子对象的起始地址那去。

  • 理解 this 指针的调整机制有助于避免在多重继承时出现的潜在错误,确保代码的正确性和可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值