c++ - 使用指向基类的指针访问 protected 继承成员

标签 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

谢谢。

最佳答案

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

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

关于c++ - 使用指向基类的指针访问 protected 继承成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15969658/

相关文章:

c++ - 将指针分配给指针数组中的索引

c++ - 如何使用 enable_if 和模板特化 c++?

c++ - 重新定义类:使用JUCE的Maximilian声音库

c++ - 如何检测无符号整数溢出?

c++ - 更改完全不相关的代码时,Visual Studio C++ 编译器生成的代码速度降低了 3 倍

c++ - Visual Studio 2019中的C2011 'CMemDC' :'class'类型重新定义

c++ - 在每个元素栏最后一个之后用逗号打印字符串 vector

c++ - 为什么我的代码无法在二进制搜索树中正确执行预购表格?

c++ - std::string 的转义表示

c++ - 有没有可能声明一个不占用内存的成员变量?