0
我有一个受保护的方法Value
。后来我用公开的方法重载它。我为什么要这样做?我认为,这是对封装的违反。为什么我可以在后继中公开受保护的方法?
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
如果这是不可能的,没有任何东西阻止我制造另一种调用受保护方法的公共方法。反正你无法真正保护它。 – deviantfan
你甚至不需要重写。派生类可以通过[using declaration](http://en.cppreference.com/w/cpp/language/using_declaration)公开一个继承的受保护方法。如果你不想让派生类看到某些东西,那么就让这个东西变成私有的。 –