gpt4 book ai didi

c++ - 为什么 friend 类成员可以通过公共(public)继承类的对象访问它成为 friend 的类的私有(private)成员?

转载 作者:行者123 更新时间:2023-12-01 14:52:11 28 4
gpt4 key购买 nike

据我们所知,private public 派生类中的成员不可访问(不仅仅是私有(private))和 protected在那里可以直接访问。

  • 如果一个类将另一个类声明为 friend然后后者可以完全访问第一个成员。

  • 这是一个我试图理解但徒劳的例子:
    class A
    {
    public:
    int pub;
    private:
    int priv;
    protected:
    int prot;
    friend class D;
    };

    class B : public A // public inheritance
    {
    int b = 0;
    };

    class C : private A
    {
    int c = 0;

    };

    class D
    {
    public:
    void foo(B);
    void bar(C);
    };

    void D::foo(B b)
    {
    b.pub = 0;
    b.prot = 0;
    b.priv = 0; // why this works? although A::priv is inaccessible in derived classes because it is private in base class?
    // b.b = 0; // error. ok because b is private
    }

    void D::bar(C c)
    {
    // c.pub = 0; // error ok
    // c.prot = 0; // error ok
    // c.priv = 0; // error ok
    // c.c = 0; // error. ok because c is private
    }
  • 问题:为什么D::foo可以访问 A 的私有(private)成员通过来自 public 的对象ly 继承自 Base A虽然我们知道 private在派生类中无法访问?那为什么 b.priv = 0;作品?我们知道 friendship既不传递也不继承?
  • 最佳答案

    class Dclass A 的 friend ,它可以完全访问其公共(public)、 protected 和私有(private)成员。 class B public继承class A ,也就是说,class D可以访问 1) 到 class B 的基类.因此,priv 的访问权限class A 的成员使用 class B 的对象允许在 class D 中使用.

    仅当您认为访问 pub 时,请阅读以下部分答案, protpriv , 在 D::bar(C)好友类功能D , 给出错误,因为 class Aprivateclass C 继承.
    如果是 class C , 它private继承class A .正如您所指出的,声明 c.pub , c.protc.privD::bar(C)函数给出错误。这是因为class C继承 class A private ly。
    如果我取消注释并编译,我在 D::bar(C) 中遇到的错误功能是:

    p.cpp:44:5: error: cannot cast 'C' to its private base class 'A'
    c.pub = 0;
    ^
    p.cpp:21:11: note: declared private here
    class C : private A
    ^~~~~~~~~
    p.cpp:44:7: error: 'pub' is a private member of 'A'
    c.pub = 0;
    ^
    p.cpp:21:11: note: constrained by private inheritance here
    class C : private A
    ^~~~~~~~~
    p.cpp:8:12: note: member is declared here
    int pub;
    prot 的相同错误和 priv成员也是。
    这些错误是由于 private class A 的继承和 无事可做和 friend class D .尝试在 friend 之外以类似方式访问它 class D你会得到同样的错误。
    使用 C 风格转换,您可以 cast a derived class to private base class , 像这样:
    void D::bar(C c)
    {
    ((A*)&c)->pub = 0;
    ((A*)&c)->prot = 0;
    ((A*)&c)->priv = 0;
    //c.c = 0; // error. ok because c is private
    }
    现在,您可以访问 class C private继承基类 ( class A) 其 friend 类中的私有(private)成员 class D .
    请注意 priv使用 D::bar(C) 中的 C 样式转换的成员访问函数是 工作正常只是因为 class Dclass A 的 friend .
    如果您尝试访问 private 的私有(private)成员使用 C 风格转换继承派生类中的基类,这是不允许的:
    class C : private A {
    int c = 0;
    public:
    void Cfoo();

    };

    void C::Cfoo() {
    ((A*)this)->pub = 100;
    ((A*)this)->priv = 100; // error: 'priv' is a private member of 'A'
    }

    1)。
    引自 this回答:
    让我们考虑一个类 Base和一个类(class) Child继承自 Base .
  • 如果继承是public ,所有知道的BaseChild也知道 Child继承自 Base .
  • 如果继承是protected , 仅 Child及其子项是
    知道它们继承自 Base .
  • 如果继承是private , 除了 Child知道
    遗产。
  • 关于c++ - 为什么 friend 类成员可以通过公共(public)继承类的对象访问它成为 friend 的类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62586359/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com