有人可以解释为什么这段代码不起作用。
class A
{
public:
A(void){}
virtual ~A(void){}
protected:
A* parent;
};
class B : public A
{
public:
B(void){parent = new B;}
~B(void){delete parent;}
protected:
int a;
};
class C : public B
{
public:
C(void){}
virtual ~C(void){}
void f(void){ ((B*)parent)->a; }
};
C
如何无法访问B
的成员?
如果我将parent
转换为C*
而非B*
,则可以正常工作。但我不希望用户承担任何不必要的风险。是否有更简洁的方式访问a
?
感谢。
答案 0 :(得分:8)
从C
类的对象,您可以访问B
的受保护成员,但前提是它们是类C
的某个对象的一部分(可能是您的,也许不是)。换句话说,要从a
访问C
,您需要指向C
的指针(或引用)。这就是protected
修饰符的含义。
原因如下。 ((B*)parent)
指针可能指向B
的其他子类,与C
完全不同,并且该子类可能无法访问a
成员。