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

+1

在一条切线上:它可能是听到['override'](http://en.cppreference.com/w/cpp/language/override)和['final'](http:/ /en.cppreference.com/w/cpp/language/final)说明符:) – Quentin

回答

1

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

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

private修饰符Step()有用吗?

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

增加可见性(例如,从protectedpublic会)可能是有用的,但附带了它的使用警告 - 基类的接口的实现者希望的方法是内部的层次结构,使其外部可以打破事情......(想到template method pattern的可能实现)。

原则上,更改可见性不会影响virtual方法的多态特性 - 它仍在派生类中重写。但它确实会影响呼叫者。将方法更改为private将客户机代码限制为从指针或对基类的引用调用该方法,而不是派生的。

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

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

+0

对Mecha专用的步骤()强制执行要使用的接口。如果可以访问Mecha和Walker,则可以确保编写更通用的代码,而Mecha类应该成为长期的实现细节。 – JVApen

3

不,制作Step()private确实不是改变多态行为。由于语言明确允许这样做,所以没有任何警告。 (但请注意,Java不)。

但它确实防止你能够编写Mecha::Step()明确的,除非你的代码,在Mecha成员函数。

相关问题