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

时间:2013-04-12 11:01:38

标签: 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; }
};

C如何无法访问B的成员?

如果我将parent转换为C*而非B*,则可以正常工作。但我不希望用户承担任何不必要的风险。是否有更简洁的方式访问a

感谢。

1 个答案:

答案 0 :(得分:8)

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

原因如下。 ((B*)parent)指针可能指向B的其他子类,与C完全不同,并且该子类可能无法访问a成员。