【问题标题】:Why can i make protected method public in a successor? [duplicate]为什么我可以在继任者中公开受保护的方法? [复制]
【发布时间】:2015-11-30 17:37:46
【问题描述】:

我有一个受保护的方法Value。接下来,我在公共方法中重载它。为什么我可以这样做?我认为,这是违反封装的。

Example:

class Foo {
public:
    Foo(int a) : m_a(a) {};
    virtual ~Foo() {};

    void PrintValue() {
        std::cout << Value() << std::endl;
    }
protected:
    virtual int Value() {
        return m_a;
    }
private:
    int m_a;
};

class Bar : public Foo
{
public:
    Bar(int a, int b) : Foo(a), m_b(b) {};
    virtual ~Bar() {};

    int Value() override {
        return m_b;
    }
private:
    int m_b;
};

int main(int argc, char** argv)
{
    Bar b(10, 20);
    b.PrintValue();
    std::cout << b.Value() << std::endl;
    return 0;
}

输出:

20
20

【问题讨论】:

  • 如果不可能,没有什么能阻止我创建另一个调用受保护方法的公共方法。无论如何,您无法真正保护它。
  • 你甚至不需要重写。派生类可以通过using declaration 公开继承的受保护方法。如果您不希望派生类看到某些内容,请将其设为私有。

标签: c++ overriding


【解决方案1】:

因为可见性/访问修饰符不是继承的。

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2020-09-17
    • 2014-10-09
    • 2011-12-05
    • 2018-09-26
    • 2015-05-16
    • 2013-07-10
    • 2018-01-05
    相关资源
    最近更新 更多