访问对象以外的受保护成员"this"
Accessing protected members for other than "this" object
我一直以为我知道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
希望这能让你对不同层次的可见性工作方式有更多的理解,我今晚回家后会查找一些参考资料,然后可以访问我的书。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么成员函数内的"this"指针为空?
- 错误:类没有名为"ThisW"的成员;你是说"这个"吗?但是代码没有说"ThisW",它已经说了"This"
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- c++:成员函数中的"this == nullptr"安全吗?
- 定义非静态成员时获取C++中的"this"类型
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- 我允许用memcpy(*this)修改构造函数中的所有类成员
- 指向成员函数签名的指针中缺少"this"指针
- 静态类成员不是与 this 指针没有关联吗?
- 何时使用'this'访问自己的成员
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 如何使用来自同名父类的成员函数(通过 this->)?
- 视觉C++:即使使用关键字,参数声明也会隐藏类成员"this"
- 成员函数与 std::move(*this) 的行为差异
- 使用'this->'成员变量访问的性能
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 是否每个c++成员函数都隐式地将"this"作为输入
- 访问对象以外的受保护成员"this"