2017-04-09 64 views
0

我有一個類CAbstractNode使用將dynamic_cast,它有5個派生類它是不好的設計在C++

5,只有2(特殊)需要一個方法SetValue()和一個構件INT NVAL;

//myFunction is virtual function of base(cAbstractNode) implemented in 2 special derived classes 
myFunction(CAbstractNode * obj, int val) 
{ 
    Derived_02 nodeObj = dynamic_cast<Derived_02*>(obj); 

    if(res != NULL) 
    { 
     nodeObj->setValue(val); 
    } 

    //remaining code goes here... 
} 


//myFunction is virtual function implemented in remaining 3 derived classes (setValue() is not needed here) 
myFunction(CAbstractNode * obj, int val) 
{ 

    //remaining code goes here... 
} 

應我去與動態轉換爲2派生類(如上所示)

我將的setValue()方法,作爲虛擬在鹼(CAbstractNode) 和在2實施派生類和此方法保持空的其他3派生類?

+1

'dynamic_cast'應該避免使用虛擬函數。 –

+1

是的,使用動態轉換打開類型是不好的設計。 –

+0

也想添加'std :: variant'作爲可能的替代品。你並不總是希望這個功能包含在這個類中。 – chris

回答

0

dynamic_castcode smell

一般這是可以解決的過載的功能或使用虛擬函數。

+0

在深層次結構中,創建虛擬方法以避免類型檢查會導致基類中SRP的違反。我不是說SRP必須完全遵循,我的意思是你的基類將包含許多不相關的方法。 –

2

問題不是dynamic_cast本身,它是一個症狀。在你的情況下,如果myFunction接受CAbstractNode接口,它應該與它一起工作。但無論出於什麼原因,它必須知道Derived_02並調用該方法,這很可能表明CAbstractNode接口設計不佳。或者至少沒有正確設計,但是由您來決定是否要修復界面或保持解決方法。記住工程主要是妥協,完美的設計往往不可達或不實際。