前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中基类私有成员会被继承吗

C++中基类私有成员会被继承吗

作者头像
恋喵大鲤鱼
发布2018-08-03 16:04:35
2.2K0
发布2018-08-03 16:04:35
举报
文章被收录于专栏:C/C++基础C/C++基础C/C++基础

1.派生类间接访问基类私有成员

在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访问并不代表不能访问。在派生类还是能够通过调用基类的共有函数的方式来间接地访问基类的私有成员,包括私有成员变量和私有成员函数。考察如下程序。

#include <iostream>
using namespace std;

class A{
    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();
    getchar();
}

程序输出结果:

5
this is a private function of base class

在类B中,由于基类A的成员变量i和成员函数privateFunc()都是私有的,所以在类B的成员函数中无法直接访问到它们。但是,由于类A的公有成员函数getI()可以访问到私有成员变量i,而usePrivateFunction()可以访问私有成员函数privateFunc(),所以在类B中通过调用函数getI()和usePrivateFunc()就可以简介访问基类A中的私有成员。

2.私有成员会被继承吗

如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?其实,这些私有成员的确是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。考察如下程序,通过一种特殊的方式访问了类的私有成员。

#include <iostream>
using namespace std;

class A{
    int i;
    void privateFunc(){
        cout<<"this is a private function of base class"<<endl;
    }

public:
    A(){i=5;}
};

class B:public A{
public:
    void printBaseI(){
        int* p=reinterpret_cast<int*>(this);//获取当前对象的首地址
        cout<<*p<<endl;
    }

    void usePrivateFunction(){
        void (*func)()=NULL;
        _asm{
            mov eax,A::privateFunc;
            mov func,eax;
        }
        func();
    }
};

int main(){
    B b;
    b.printBaseI();
    b.usePrivateFunction();
}

程序输出结果:

5
this is a private function of base class

(1)虽然类A没有提供访问私有成员变量i的公有方法,但是在类A(以及类A的派生类)对象中个,都包含变量i。

(2)虽然类A并没有提供访问私有成员函数privateFunc()的公有函数,但是在程序代码区依然存有函数privateFunc()的代码,通过内联汇编获取该函数的入口地址,仍然可以顺利调用。

综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员,读者可自行考证。只不过收到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年11月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.派生类间接访问基类私有成员
  • 2.私有成员会被继承吗
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档