2015-04-17 70 views
5

用另一个纯虚方法覆盖纯虚方法是否合理?是否有任何功能差异或代码风格的原因,以优先选择下列选项之一?C++用纯虚方法覆盖纯虚方法

class Interface { 
public: 
    virtual int method() = 0; 
}; 

class Abstract : public Interface { 
public: 
    int method() override = 0; 
}; 

class Implementation : public Abstract { 
public: 
    int method() override { return 42; } 
}; 

对战:

class Interface { 
public: 
    virtual int method() = 0; 
}; 

class Abstract : public Interface {}; 

class Implementation : public Abstract { 
public: 
    int method() override { return 42; } 
}; 
+1

它只能用于与读取您的代码的人进行通信。 *“亲爱的人看着我的抽象代码......注意这个类确实有一个虚拟功能。” –

回答

4

两个代码产生同样的效果:类Abstract是抽象的,你不能实例化。

然而有两种形式之间的语义差别:

  • 第一种形式明确该类Abstract是抽象的提醒(以防万一它的名字也不会自sepaking足够 ;-) )。它不仅提醒它:它还通过确保该方法是纯粹的虚拟来确保它。
  • 第二种形式意味着类Abstract继承了Interface中的所有内容。它是抽象的,当且仅当它的基类是。

这对代码的未来演变有影响。举例来说,如果有一天你改变了主意,想界面有一个缺省实现为method()

  • 在第一种形式Absract仍然是抽象的,不会继承方法的默认实现。
  • 第二种形式确保Abstact将继续继承,并且行为与Interface完全一样。

Personnally我发现第二种形式更直观,并确保更好地分离担忧。但我可以想象,在某些情况下,第一种形式可能真的有意义。

4

方法的纯规范强制覆盖,但它并不妨碍您提供该方法的实现。以下是一种罕见的,但有时是有用的技术。

class Interface 
{ 
    virtual void method() = 0; 
}; 

class Abstract : public Interface 
{ 
    virtual void method() = 0; 
} 
inline void Abstract::method() 
{ 
    do something interesting here; 
} 

class Concrete : public Abstract 
{ 
    virtual void method(); 
} 

inline void Concrete::method() 
{ 
    // let Abstract::method() do it's thing first 
    Abstract::method(); 
    now do something else interesting here; 
} 

如果有从抽象这就需要一些通用的功能派生几类,但还需要添加类特定行为这有时是有用的。 [并且应该被迫提供这种行为。]

+1

注意'inline'只是为了让代码有意义,如果它全部出现在标题中。在实践中,你可能应该避免内联虚拟方法! –