[英]C++: use a pure virtual function in a non-virtual function
我正在嘗試創建一個基類,為所有派生類定義接口。
我想有一個函數,允許該類讀取該類的配置文件,使用boost::property_tree
。 我們將此函數稱為readConfig
。 這必須在每個派生類中定義,因此我將其設為純虛擬的。
我想重載基類中的readConfig
函數,其中基類中的每個重載函數最終都將調用純虛擬形式,例如:
class Base
{
// ...
void readConfig(string, string); // read config from file
virtual void readConfig(boost::property_tree::ptree, string) =0; // read config from ptree
}
void Base::readConfig(string filename, string entry)
{
boost::property_tree::ptree pt;
read_xml(filename, pt);
readConfig(pt, entry); // <= Calling pure virtual function!
}
基本上,字符串版本只是純虛擬形式的快速包裝。 編譯時,出現錯誤:
no known conversion for argument 1 from std::string to boost::property_tree::ptree`
如此看來,非虛擬功能(來自Base
)未被識別為可用。 我檢查了派生類的定義是否正確:
class Deriv : public Base
{
// ...
void readConfig(boost::property_tree::ptree, string); // implement virtual, error is on this line
}
void Deriv::readConfig( boost::property_tree::ptree pt, string entry)
{
//...
}
請注意,我省略了很多const
-correctnes,通過引用傳遞等,以使代碼更具可讀性。
我該怎么做才能解決此問題? 在非虛擬函數中使用純虛擬成員函數是一個好主意嗎?
請參閱標題為“什么是警告,警告:派生:: f(char)隱藏基數:: f(double)?”的FAQ項目。” 可以在常見問題解答的許多鏡像中找到,包括常見問題解答的原始英語版本 。
在發布前檢查FAQ通常是個好主意。
您很有可能還會發現標題為“好的,但不是針對當前問題的FAQ”有用,但是有沒有一種方法可以模擬這種行為,就像動態綁定對基類的構造函數中的此對象起作用一樣? ,此外,如果這變得有意義,那么您可能也有興趣閱讀我有關DBDI問題的博客文章 。
明顯的錯別字是顯而易見的:
virtual void readConfug
代替
virtual void readConfig
另外,您要實現的方法稱為模板方法模式 FYI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.