子类是否会影响虚拟方法的可见性?

时间:2016-08-12 11:26:02

标签: c++ inheritance access-modifiers class-visibility

我们说我有一个拳头班

class Walker {
public:
   Walker();
   virtual ~Walker();
   virtual void Step();
};

然后是第二个,来自前者

class Mecha : public Walker {
public:
   Mecha();
   virtual ~Mecha();
private:
   virtual void Step();
};

private上的Step()修饰符是否有用? Mecha::Step()仍然可以被称为Walker::Step(),不是吗?我不应该发出警告,因为我试图通过其子类的定义来改变超类的性质吗?

2 个答案:

答案 0 :(得分:3)

不,让Step() private 会改变多态行为。由于语言明确允许,因此没有任何警告。 (但请注意Java没有。)

确实会阻止您明确地编写Mecha::Step(),除非您在Mecha的成员函数中对其进行编码。

答案 1 :(得分:1)

  

子类是否会影响虚拟方法的可见性?

是的,他们可以改变方法的可见性。

  

private上的Step()修饰符是否有用?

取决于。它主要影响代码的客户端。

提高可见性(例如从protected转到public)可能很有用,但会对其使用提出警告 - 基类接口的实现者希望该方法是内部的层次结构,使外部可能会破坏事物......(template method pattern的可能实现会浮现在脑海中。)

主要是,更改可见性不会影响virtual方法的多态性 - 它仍会在派生类中被覆盖。但它会影响来电者。将方法更改为private会将客户端代码限制为从指针调用方法或引用基类而不是派生。

Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()

此外,将方法更改为protected将允许更多子类调用它。