我一直以为我知道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 ++标准进行了更改?
答案 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
希望这让人们更清楚地了解可见性在不同层面的工作方式,今晚我回到家后可以查看一些参考资料,并可以访问我的书籍。