【问题标题】:Can't call virtual protected method in derived class [duplicate]无法在派生类中调用虚拟保护方法[重复]
【发布时间】:2017-01-15 16:36:56
【问题描述】:

以下代码在 GCC 4.9.1 中无法编译:

class A
{
protected:
   virtual void f() {}

};

class B : public A
{
protected:
   virtual void f() override { A* a = new A; a->f(); }
};

我得到以下信息:

header.h: In member function 'virtual void B::f()':
header.h:51:17: error: 'virtual void A::f()' is protected

我希望它能够编译。

为什么会失败?有没有比公开 f() 更好的方法?

【问题讨论】:

    标签: c++ protected virtual-functions


    【解决方案1】:
    A* a = new A; a->f();
    

    问题出在这里: 您不能从a 调用f(),因为它不是public,并且在成员函数范围内B 无法访问。


    It Works!

    【讨论】:

    • 好的。奇怪的是我可以发誓我以前见过这样的东西并且它成功编译了。
    • 您之前可能已经将f() 标记为公开...反正我已经添加了一个示例
    • 也许吧。它可能取决于编译器吗?我以前用VC++
    • 在 Visual Studio 2015 上编译您的示例,我得到类似的错误,在 g++ 上编译也会产生类似的错误。
    • 是的,我也不确定。我的意思是,复制构造函数可以从作为参数传递的对象中访问受保护的和私有的成员变量,对吗?复制构造函数还能如何工作?那么为什么A类的对象不能调用同一个类的另一个对象的受保护成员函数呢?
    【解决方案2】:

    您不能仅仅因为B 继承自该类而在类的不同实例或父类的实例之间交叉调用受保护的方法。

    无论如何B 已经是A
    你打算打电话给A::f();吗?

    class B : public A {
    protected:
        virtual void f() override { A::f(); /* ... whatever ... */ }
    };
    

    【讨论】:

    • 不,不是 A::f()。这种行为是否随着更新的 C++ 标准而改变?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多