类的继承私有成员问题

本文探讨了C++类继承时私有成员的处理。尽管私有成员在派生类中不可见,但实验结果显示它们依然被继承。通过对类对象的内存分析,可以了解私有成员在对象空间中的分布,并据此探讨如何在类外部间接访问私有成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的继承过程分为公有继承,保护继承和私有继承,无论哪一种继承,基类的私有成员在派生类成员中都是不可见的,可是基类的私有成员是否被派生类继承了呢?通过以下实验即可知道。

代码如下:

#include <iostream>
using namespace std;
class Base {
public:
Base():a(5){}
private:
     virtual void f() { cout << "Base::f" << endl; }
     int a;
 
};
class Derive : public Base{


};
void main() {
    Derive d;
    int** pVtab = (int**)&d;
    Fun  pFun = (Fun)pVtab[0][0];
    cout<<sizeof(Base)<<sizeof(Derive)<<endl;
    pFun();
    cout<<(int)pVtab[1]<<endl;
    return ;
}


监视窗口如下图:


运行结果如下:

由以上可知,基类的私有成员被派生类继承了,而类的对象空间没有响应的常规函数成员的分布。同时根据类的对象的内存空间的分布,我们可以在类外访问类的私有成员。

### C++继承私有成员的行为和访问控制 在 C++继承机制中,基私有成员具有严格的访问限制。具体来说,在派生中无法直接访问这些私有成员,无论是通过派生对象、指针还是引用都无法实现直接访问[^1]。 然而,“不可见”并不意味着完全无法触及。尽管派生不能直接操作基中的私有成员,但它可以通过调用基提供的公共接口来间接访问或修改这些私有数据。例如,如果基提供了公有的 getter 和 setter 方法,则派生可以利用这些方法获取或设置基私有成员的状态。 #### 示例分析 考虑以下代码片段: ```cpp #include <iostream> using namespace std; class A { private: int i; void privateFunc() { cout << "this is a private function of base class" << endl; } public: A() { i = 5; } int getI() { return i; } // 提供对外部访问的接口 void usePrivateFunc() { privateFunc(); } // 调用私有函数 }; class B : public A { public: void printBaseI() { cout << getI() << endl; // 使用基公开的方法访问私有成员 } void usePrivateFunction() { usePrivateFunc(); // 借助基公开方法调用其内部私有功能 } }; int main() { B b; b.printBaseI(); b.usePrivateFunction(); } ``` 在此示例中,`A` 定义了一个私有整型变量 `i` 及一个私有函数 `privateFunc()`。虽然这两个实体对于派生 `B` 是隐藏的,但 `B` 可以借助于 `A` 所暴露出来的 `getI()` 函数以及 `usePrivateFunc()` 来分别读取 `i` 的值并触发 `privateFunc()` 的执行[^1]。 另外值得注意的是,即使是在同一个内的不同实例之间也不能互相访问对方的私有部分;只有当前这个特定的对象才能让自己的任何成员(无论公有还是私有)去触碰它的那些被标记为隐私的数据项[^2]。 综上所述,C++ 设计了一套严谨而灵活的权限管理系统用于处理子父级关系下的资源共享问题——既保障了封装原则下应有的隔离度,又保留足够的弹性允许必要的交互发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值