2015-09-04 82 views
0

我有一个受保护的方法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 
+1

如果这是不可能的,没有任何东西阻止我制造另一种调用受保护方法的公共方法。反正你无法真正保护它。 – deviantfan

+0

你甚至不需要重写。派生类可以通过[using declaration](http://en.cppreference.com/w/cpp/language/using_declaration)公开一个继承的受保护方法。如果你不想让派生类看到某些东西,那么就让这个东西变成私有的。 –

回答

0

由于能见度/访问修饰符不被继承。

相关问题