1

我正在尝试创建一个为所有派生类定义接口的基类。

我想要一个函数,允许读取该类的配置文件,使用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`

看来,非虚拟函数(from 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、按引用传递等,以使代码更具可读性。

我能做些什么来解决这个问题?在非虚函数中使用纯虚成员函数是个好主意吗?

4

2 回答 2

3

请参阅标题为“警告是什么意思:Derived::f(char) 隐藏 Base::f(double)?”的常见问题解答项目。可在常见问题解答的众多镜像中找到,包括常见问题解答的原始英文版

在发布之前检查常见问题解答通常是一个好主意。

很有可能您还会发现标题为“好的,但是有没有办法模拟这种行为,就像动态绑定在我的基类的构造函数中对 this 对象起作用一样?”的常见问题解答项目很有帮助(尽管不是直接的问题)。 ,另外,如果这变得相关,那么您可能也有兴趣阅读我关于 DBDI 问题的博客文章

于 2012-05-05T19:30:30.297 回答
2

明显的错字很明显:

virtual void readConfug

代替

virtual void readConfig

此外,您正在实施的称为模板方法模式,仅供参考。

于 2012-05-05T19:12:25.533 回答