【问题标题】:Can a sub-class affect visibility of virtual methods?子类会影响虚拟方法的可见性吗?
【发布时间】:2016-12-19 09:39:44
【问题描述】:

假设我有一个拳头课

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

【问题讨论】:

  • 切线:现在可能是了解 overridefinal 说明符的好时机 :)

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


【解决方案1】:

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

是的,它们可以更改方法的可见性。

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

视情况而定。它主要影响代码的客户端。

增加可见性(例如,从protectedpublic)可能有用,但在使用时会发出警告——基类接口的实现者希望该方法在层次结构内部,使其成为external 可能会破坏事情......(想到template method pattern 的可能实现)。

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

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

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

【讨论】:

  • 在 Mecha 上设置 Step() 私有会强制使用接口。如果可以同时访问 Mecha 和 Walker,这对于确保编写更通用的代码很有用,而 Mecha 类应该成为长期的实现细节。
【解决方案2】:

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

但它确实阻止您显式编写Mecha::Step(),除非您在Mecha 的成员函数中编写代码。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 2011-02-22
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多