使用指向基类的指针访问受保护的继承成员

JMR*_*MRC 0 c++

有人可以解释为什么这段代码不起作用.

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; }
};
Run Code Online (Sandbox Code Playgroud)

怎么可能C无法访问B

如果我转换parent为a C*而不是B*它工作正常.但我不希望用户承担任何不必要的风险.是否有更清洁的方式访问a

谢谢.

sha*_*rov 8

C类的对象中,您可以访问受保护的成员B,但前提是它们是某个类对象的一部分C(可能是您的,也许不是).换句话说,a要从中进行访问C,您需要一个指针(或引用)C.这就是protected修饰符的含义.

原因如下.该((B*)parent)指针可以指向一些其他子类B,从完全不同的C,并且该子类可具有a构件不可访问.