“methodX() is a protected member of MyClass”(method X() is a protected member of MyClass“错误,该错误在扩展 MyClass 的类中

"methodX() is a protected member of MyClass" error inside class that extends MyClass

提问人:Mr. Developerdude 提问时间:3/4/2023 更新时间:3/4/2023 访问量:66

问:

在以下代码中:

struct A{
protected:
    virtual void IAmProtected() = 0;
};

struct B: public A{
private:
    A * a;
protected:
    void IAmProtected() override;
    
public:
    
    void doSomething(){
        a->IAmProtected(); // ERROR: 'IAmProtected' is a protected member of 'A'
    }
};

我得到“IAmProtected”是“A”的受保护成员,我觉得这很奇怪,因为 B 实际上是 A 的扩展。

我想知道

  1. 为什么会这样?
  2. 我怎样才能防止这种情况发生?
C++ 继承 保护 纯虚拟

评论

1赞 Nathan Pierson 3/4/2023
访问的一个怪癖是,派生类的实例只能访问其自己的受保护成员,而不能访问属于该类的另一个实例的成员。protected
0赞 Adrian Mole 3/4/2023
该行从“类内部”访问受保护的函数。它尝试从外部访问该受保护的函数,通过指向类对象的指针调用它。调用纯虚函数也犯了错误。a->IAmProtected();
0赞 Adrian Mole 3/4/2023
我不确定你真正想要实现什么,但你同时使用了继承和组合(嗯,有点)。为什么你来自一个成员,并且还有一个成员?BBAA*
0赞 Mr. Developerdude 3/4/2023
@AdrianMole:我想在Qt6中扩展一个我无法控制的现有类(QSyntaxHighlighter),我想实现一个“联合”类,该类将允许我为子实例列表运行受保护的highlightBlock(const QString &text)。我想这将永远是一个白日梦。
0赞 Adrian Mole 3/4/2023
你可以只通过继承来做到这一点。在进行覆盖中,然后在该覆盖中调用 .BpublicA::IamProtected()

答: 暂无答案