sub-class 会影响虚拟方法的可见性吗?
Can a sub-class affect visibility of virtual methods?
假设我有拳头class
class Walker {
public:
Walker();
virtual ~Walker();
virtual void Step();
};
然后是第二个,从前者派生而来
class Mecha : public Walker {
public:
Mecha();
virtual ~Mecha();
private:
virtual void Step();
};
Step()
上的 private
修饰符有用吗? Mecha::Step()
仍然可以称为 Walker::Step()
,不是吗?当我试图通过它的子 class 的定义来改变超级 class 的性质时,不应该有警告吗?
不,使 Step()
private
不会 改变多态行为。没有警告,因为语言明确允许这样做。 (但请注意 Java 没有)。
但它 确实 阻止您显式地编写 Mecha::Step()
,除非您在 Mecha
的成员函数中编写代码。
Can a sub-class affect visibility of virtual methods?
是的,他们可以更改方法的可见性。
Is that private
modifier on Step()
useful?
视情况而定。它主要影响代码的客户端。
增加可见性(例如,从 protected
到 public
)可能有用,但会附带警告 - 基础 class 接口的实现者希望方法在层次结构内部,使其在外部可能会破坏事物...(想到 template method pattern 的可能实现)。
原则上,更改可见性不会影响 virtual
方法的多态性 - 它仍然在派生的 class 中被覆盖。但是,它确实会影响调用者。将方法更改为 private
将客户端代码限制为从指针或对基 class 而非派生的引用调用方法。
Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()
此外,将方法更改为 protected
将允许更多子 class 调用它。
假设我有拳头class
class Walker {
public:
Walker();
virtual ~Walker();
virtual void Step();
};
然后是第二个,从前者派生而来
class Mecha : public Walker {
public:
Mecha();
virtual ~Mecha();
private:
virtual void Step();
};
Step()
上的 private
修饰符有用吗? Mecha::Step()
仍然可以称为 Walker::Step()
,不是吗?当我试图通过它的子 class 的定义来改变超级 class 的性质时,不应该有警告吗?
不,使 Step()
private
不会 改变多态行为。没有警告,因为语言明确允许这样做。 (但请注意 Java 没有)。
但它 确实 阻止您显式地编写 Mecha::Step()
,除非您在 Mecha
的成员函数中编写代码。
Can a sub-class affect visibility of virtual methods?
是的,他们可以更改方法的可见性。
Is that
private
modifier onStep()
useful?
视情况而定。它主要影响代码的客户端。
增加可见性(例如,从 protected
到 public
)可能有用,但会附带警告 - 基础 class 接口的实现者希望方法在层次结构内部,使其在外部可能会破坏事物...(想到 template method pattern 的可能实现)。
原则上,更改可见性不会影响 virtual
方法的多态性 - 它仍然在派生的 class 中被覆盖。但是,它确实会影响调用者。将方法更改为 private
将客户端代码限制为从指针或对基 class 而非派生的引用调用方法。
Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()
此外,将方法更改为 protected
将允许更多子 class 调用它。