[英]Is it bad practice to use an empty base class to force inheritance for an abstract factory?
[英]Is inheritance from a base class with no virtual methods bad practice?
我回憶一下有關dynamic_cast的問題。 dynamic_cast無法工作,因為基類沒有虛方法。 其中一個答案說,從沒有虛擬方法的類派生通常意味着糟糕的設計。 它是否正確? 即使沒有利用多態性,我仍然無法看到這樣做的錯誤。
這取決於我們所談論的內容:
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.