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

时间:2014-03-18 15:27:16

标签: c++ access-modifiers

我一直以为我知道protected的含义。这里也有一个很好的解释:Private and Protected Members : 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 ++标准进行了更改?

1 个答案:

答案 0 :(得分:-1)

每个人都需要一个朋友!

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

friend class C;

}函数的最后一个foo()之后立即允许C访问。

This link at 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

希望这让人们更清楚地了解可见性在不同层面的工作方式,今晚我回到家后可以查看一些参考资料,并可以访问我的书籍。