0

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

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为 aC*而不是 aB*它工作正常。但我不希望用户承担任何不必要的风险。有更清洁的访问方式a吗?

谢谢。

4

1 回答 1

8

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

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

于 2013-04-12T11:14:16.773 回答