访问对象以外的受保护成员"this"

Accessing protected members for other than "this" object

本文关键字:成员 this 受保护 对象 访问      更新时间:2023-10-16

我一直以为我知道protected是什么意思。这里也有一个很好的解释:私有和受保护成员:c++。我对它的理解是:无论何时在派生类的上下文中,我都可以调用其基类的受保护成员。

在下面的代码中,我试图在派生类中调用受保护的方法,但它是在继承的不同分支中的另一个对象上调用的。由于某种原因,这会导致一个错误(在g++和clang++中都尝试过)。

#include <iostream>
class A {
    protected:
        void foo() {
            std::cout << "Hello world!n";
        }
};
class B : public A {
};
class C : public A {
    public:
        void bar(B* other) {
            foo(); //OK
            other->foo(); //Error
        }
};
int main() {
    return 0;
}
所以我的问题是:对于受保护的成员来说,到底是什么规则?最近新的c++标准有改变吗?

每个人都需要朋友!

类也不例外:当他们需要分享或大或小的秘密(私人或受保护)时,他们需要知道他们有一个朋友。只需在a类中插入一行,声明C是友元,就可以访问其他无法访问的成员和函数:

friend class C;

紧跟在foo()函数的最后一个}之后,将允许C访问。

这个位于cplusplus.com的链接将帮助您了解有关友类的更多细节,尽管在大多数情况下,如果您发现自己不得不过于频繁地授予友类状态,那么重新考虑继承层次结构可能是合适的。

这是你的源代码与朋友的修改版本:

#include <iostream>
class A {
    protected:
        void foo() {
            std::cout << "Hello world!n";
        }
        friend class C;
};
class B : public A {
};
class C : public A {
    public:
        void bar(B* other) {
            foo(); //OK
            other->foo(); //no error if A and C are friends
        }
};
int main() {
    B* b = new B();
    C* c = new C();
    c->bar(b);
    return 0;
}

如果你需要更多的信息请告诉我:)

附录:发生这个错误是因为你有一个间接层,当B或C可以从它们的直接祖先a访问受保护的方法时,它们不能通过另一个类的实例访问它,因为在那个级别,受保护的成员实际上是私有的:

Class A    ---    protected foo()
Class B    ---    inherits from A: foo() effectively private at B level
Class C    ---    inherits from A: foo() effectively private at C level
           ---    bar() method calls instance of B to provide access to foo() via B
                  however this is not valid because foo() is private for B, 
                  therefore C cannot call it
           ---    also has its own call to foo(): Valid call to its own private function

希望这能让你对不同层次的可见性工作方式有更多的理解,我今晚回家后会查找一些参考资料,然后可以访问我的书。