【问题标题】:detecting virtual methods检测虚方法
【发布时间】:2013-06-16 05:50:13
【问题描述】:

我有一个类可以解析文档并调用派生类来通知在流中找到的某些事件。因为解析器必须处理编码并将部分文档重新写入字符串,所以如果虚拟方法没有被覆盖,我想避免重写。伪代码:

class Parser
{
    virtual void Callback ( string )
    {
        // Do nothing
    }
private:
    void ParseFile()
    {
        // Parse the file in the files encoding
        // Checks and more checks
        // Found sth. So need to convert to a string a call the
        // callback, but if there is no callback what's the point
        // in wasting cycles?

        if ( Callback ) // In the world of C we could check for a func pointer
            Callback( /* with the string */ )
    }
}
class User : public Parser
{
    void Callback ( string )
    {
        // This string means sth. me
    }
}
class NonUser : public Parser
{
    // I don't care about Callback so I won't implement it
}

在 C 代码中,我们将编写一个函数并将指向该函数的指针传递给实现。在内部,它会检查指针是否指向某个东西并调用它。派生类如何实现相同的功能? IE。在浪费时间/CPU 周期/内存构造一个甚至可能不需要的字符串之前检查虚拟方法是否实际存在于派生类中。

编译时间检查,如果它是可移植的,将是理想的,但我认为这与 v-tables 有关,所以运行时间检查也可以工作。

经过更多研究,很明显 v-tables 已经过时了,这几乎是不可能的。我会稍微改变一下我的问题,问上面是否可以使用某种类型的,也许是模板,诡计?

【问题讨论】:

  • 您可以使用 dynamic_cast 作为对返回值的空检查。
  • @H2C03 我看到你在没有提供任何理由的情况下再次对我投了反对票。在发布之前,我阅读了这些帖子和其他帖子。他们已经很老了,希望可能有 c++11 或其他一些技巧可用。
  • @shiakumar 我认为您的意思是 static_cast 仅适用于派生实例。 dynamic_cast 会将指针转换为几乎任何东西。
  • 如何添加另一个虚拟方法,该方法将返回指示基类感兴趣的回调的标志?另一个想法是将所有这些转换放入 Parser::getMoreText() 之类的方法中,该方法只能从派生方法内部调用。

标签: c++ polymorphism portability derived


【解决方案1】:

您可以将参数设为std::future,并采用简单的派生方法。

或者代替字符串,传入一个代理或者可以提供它的函数。

或者反过来,什么都不传递,在 Base 中有一个成员函数,它返回创建时的字符串。

另一种方法是对该功能使用虚拟谓词函数:在您的基类中它返回 false,其他返回 true,因此您可以在实际工作之前调用它。或者,如果它可能在静态函数中可行,它可以为实现返回一个指向函数的指针。 (这可以作为另一个参数传递......)

阅读您研究得出的 vtables 结论会很有趣。

只有在编译时你可以告诉目标,模板才会对你有所帮助。您所说的问题意味着处理仅在运行时出现的信息。这需要一些指针或其他实际传递的信息。但是你可能会想出一个对问题的精确描述。

【讨论】:

  • 一些有趣的想法。传递代理与使用 getMoreData 的上述注释相同,这与您对谓词函数的建议非常相似,这又类似于指向函数的指针。添加一个带有 true 或 false 返回标志的 stringAboutToBegin() 成员可能会起作用,但它需要两个虚拟成员,如果可能的话,我想避免这种情况。 vtables 似乎是特定于编译器的,所以我要远离它们。
猜你喜欢
  • 2014-05-19
  • 2015-05-25
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多