加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 一个朋友类对象访问基类的派生类对象的私有成员?

发布时间:2020-12-16 06:00:41 所属栏目:百科 来源:网络整理
导读:我很惊讶,下面的代码编译. 看来,类(公开继承)的基类可以访问派生类的实例的基类的成员. 如果继承更改为私有,则编译失败. 简而言之,d.b_var如何在F :: func(D d)中有效? #include iostream#include stringusing namespace std;class B{ int b_var; friend cl
我很惊讶,下面的代码编译.

看来,类(公开继承)的基类可以访问派生类的实例的基类的成员.

如果继承更改为私有,则编译失败.

简而言之,d.b_var如何在F :: func(D& d)中有效?

#include <iostream>
#include <string>
using namespace std;

class B{
    int b_var;
    friend class F;
};

class D: public B{
    int d_var;
};

class F{
    public:
        void func(D &d){
            d.b_var = 5; 
        }
};

int main()
{
    cout<<"fine";
}

解决方法

D类的对象由两部分组成:
part containing members of B 
part containing members of D

为什么对象切片的概念在我们做的时候起作用:

D objD;
B objB = objD;

现在我们可以通过objB从D类的内部对象访问包含B的成员的部分.编译器记住或可以区分类D内的两个部分.所以编译器知道正在通过什么访问什么.

声明朋友类F;在B类内部简单地告诉F类的成员函数可以访问类B的私有,受保护和公共成员.也就是说,对于类F的成员函数,B类的所有成员都是public.

其实每个班里面都有三段w.r.t可访问性:

public
protected
private

所以当我们声明一些B类:

class B
{
    public:
        int a;
    protected:
        int b;
    public:
        int c;
};

那么如上所示,在B类中创建以下3个部分.

现在我们宣布一些F级成为B级的朋友:

class B
{
    friend class F;
    private:
        int a;
    protected:
        int b;
    public:
        int c;            
};

那么编译器会创建如下部分:

class B
{
    friend class F;
    private:
        int a;
    protected:
        int b;
    public:
        int c;
        //int a;  only for member functions of class F
        //int b;  only for member functions of class F             
};

注意int和int b;现在公开为F类的成员职能

现在当D类从B类公开派生时,B类的公共部分成为D类的公共部分.Similary,B类的被保护部分成为D类的保护部分.因此,B类的公共部分部分可以通过D类的对象访问.由于B :: a;和B :: b;在F类的成员函数的公共部分中,因此可以通过类D的对象访问B :: a和B :: b.另请注意,虽然在导出后,int a;和int b;成为D类的成员,仍然编译器能够区分它们并将它们视为B类的一部分.

现在,当D类从B类私有派生时,B类的公共部分成为D类的私有部分.Similary,B类的受保护部分成为D类的保护部分.因此,现在B类中的公共部分不能通过类D的对象访问.回想一下,在B类中,B :: a;和B :: b;最初在公共部分用于F类的成员函数,但是在私有派生之后,B类的成员即B :: a和B :: b现在是类D的私有部分.因此,B :: a和B :: b不能通过类D的对象访问.另请注意,虽然在派生后int a;和int b;成为D类的成员,仍然编译器能够区分它们并将其视为B类的一部分.派生后,B类的某些成员的可访问性和规则已更改.

由于这个问题有点与公共,受保护和私人派生的影响有关,所以为了完整性,请参见:
Why can a derived class not access a protected member of its base class through a pointer to base?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读