我有以下代码:
struct A {
protected:
A() {}
A* a;
};
struct B : A {
protected:
B() { b.a = &b; }
A b;
};奇怪的是,它不能编译。罪魁祸首是b.a = &b;赋值: GCC和clang都抱怨A()是受保护的,这应该不是问题,因为B继承了A。我进入了标准的哪个黑暗角落?
发布于 2012-09-05 04:42:20
实际上这里有两个独立的问题。
首先,这一行不只是执行赋值,而是尝试初始化基类(它工作得很好)和成员b。为了创建b成员,它需要构造它,并且作为一个成员,它需要对构造函数的public访问,而这是它所没有的。
那么赋值也不能访问b的非公共成员,因为它不是B类型,而是A类型。
请记住,protected意味着您只能通过B对象(或子对象)访问A的某些部分。
在这种情况下,告诉我们您真正的问题,我们可以尝试帮助解决它。继承和组合相同的类型是一种设计的味道。
发布于 2012-09-05 04:40:53
我测试的所有编译器都抱怨了几件事,特别是受保护的构造函数,即使删除了赋值语句,它也会成为问题。
您无法访问从中派生的类型的任何实例的protected成员。这个问题在11.4p1的示例中得到了澄清。
class B {
protected:
int i;
static int j;
};
class D1 : public B {
};
class D2 : public B {
void mem(B*, D1*);
};
void D2::mem(B* pb, D1* p1) {
pb->i = 1; // ill-formed
p1->i = 2; // ill-formed
// ...
}发布于 2014-09-09 17:45:37
这似乎是C++语言的一个很大的限制。你将如何解决这样的问题:
class Node
{
public:
void Save();
protected:
virtual void SaveState(int type) = 0;
};
class BinaryNode : public Node
{
protected:
Node *left;
Node *right;
virtual void SaveState(int type) override
{
left->SaveState(type);
right->SaveState(type);
}
};在本例中,我不想让方法SaveState在Node层次结构之外可见。只有方法Save应为public。
https://stackoverflow.com/questions/12270941
复制相似问题