簡體   English   中英

從沒有虛擬方法的基類繼承不好的做法?

[英]Is inheritance from a base class with no virtual methods bad practice?

我回憶一下有關dynamic_cast的問題。 dynamic_cast無法工作,因為基類沒有虛方法。 其中一個答案說,從沒有虛擬方法的類派生通常意味着糟糕的設計。 它是否正確? 即使沒有利用多態性,我仍然無法看到這樣做的錯誤。

這取決於我們所談論的內容:

  • 對於Traits類(沒有數據)它很好( std::unary_function在腦海中)
  • 對於private繼承(使用而不是組合從空基優化中受益)它也沒關系

當您開始以多態方式處理此類Derived對象時,問題就來了。 如果你曾經獲得這樣的位置,那么它就是明確的代碼味道

注意:即使上面提到的很好,你仍然提供了以多態方式使用該類的能力,因此你將自己暴露給微妙的錯誤。

出於代碼重用的目的,從類派生始終是有效的選項。

有時,我們不是在尋找多態行為。 沒關系 - 我們有這個選擇的原因。 但是,如果是這種情況,那么請考慮使用私有繼承 - 如果您的類不是多態的,那么任何人都沒有理由嘗試以多態方式使用它。

這是一個很好的例子,將行為分解為策略(請注意受保護的析構函數):

struct some_policy
{
    // Some non-virtual interface here
protected:
    ~some_policy() { ... }

private:
    // Some state here
};

struct some_class : some_policy, some_other_policy { ... };

另一個Ok例子,避免模板中的代碼膨脹。 請注意受保護的析構函數:

struct base_vector
{
    // Put everything which doesn't depend 
    // on a template parameter here

protected:
    ~base_vector() { ... }
};

template <typename T>
struct vector : base_vector
{ ... };

另一個例子叫做CRTP。 請注意受保護的析構函數:

template <typename Base>
struct some_concept 
{
    void do_something { static_cast<Base*>(this)->do_some_other_thing(); }

protected:
    ~some_concept() { ... }
};

struct some_class : some_concept<some_class> { ... };

另一個例子,稱為空基優化。 本質上不是真正的繼承,因為它更多的是允許編譯器在some_class為基類(充當私有成員)保留空間的some_class

template <typename T>
struct some_state_which_can_be_empty { ... };

template <typename T>
struct some_class : private some_state_which_can_be_empty<T> { ... };

根據經驗,您繼承的類應該具有虛擬或受保護的析構函數。

在C ++中沒有虛方法的繼承只不過是代碼重用。 沒有多態性,我想不到繼承。

C ++標准庫中的某些類具有受保護的成員(僅對派生類有意義)但沒有虛擬成員函數。 即,它們是為衍生而設計的,沒有虛擬。 這證明從沒有虛擬的類派生一般必須是糟糕的設計。

干杯&hth。,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM