簡體   English   中英

C ++:在非虛函數中使用純虛函數

[英]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.

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