3

假设我有一个拳头课

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(),不是吗?当我试图通过定义超类的子类来改变超类的性质时,不应该有警告吗?

4

2 回答 2

3

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

但它确实会阻止您Mecha::Step()显式编写,除非您在Mecha.

于 2016-08-12T11:27:46.263 回答
3

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

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

那个private修饰符Step()有用吗?

依靠。它主要影响代码的客户端。

增加可见性(例如从protectedto public)可能很有用,但在使用时会发出警告 - 基类接口的实现者希望该方法位于层次结构内部,使其外部可能会破坏事情......(可能我想到了模板方法模式的实现)。

原则上,改变可见性不会影响virtual方法的多态性——它仍然在派生类中被覆盖。但是,它确实会影响调用者。更改方法以private将客户端代码限制为从指针或对基类的引用而不是派生类调用方法。

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

此外,将方法更改为protected将允许进一​​步的子类调用它。

于 2016-08-12T11:37:30.767 回答