【问题标题】:Can I tell if a C++ virtual function is implemented我可以判断是否实现了 C++ 虚函数
【发布时间】:2016-01-16 20:53:55
【问题描述】:

我希望能够在运行时判断一个类的实例是否实现了一个虚函数。例如:

struct Base
{
    virtual void func(int x) { <default behavior here> }
    virtual void func2(int x) { <default behavior here> }
};

struct Deriv : Base
{
    virtual void func(int x) override { <new behavior here> }
};

int main()
{
    Base *d = new Deriv;

    if(implements<Base::func(int)>(d)) // This should evaluate true
    {} 

    if(implements<Base::func2(int)>(d)) // This should evaluate false
    {}
}

我看过这个,但它已经过时了,c++11/14 现在可能要说一些话: Ways to detect whether a C++ virtual function has been redefined in a derived class

【问题讨论】:

  • 也许我不明白你在问什么。虚函数意味着在派生类中被覆盖...
  • 练习的最终目标是什么?如果我在Deriv 中添加类似virtual void func2(int x) { Base::func2(x); } 的内容,你为什么要这个事实——按理说什么应该是无操作的——来改变你的程序的行为? (无论如何,我认为你不能。)
  • 我现在添加了一些默认实现,因此您可以想象这些函数正在执行的操作有。他们所做的与我的问题无关:我只想找出 if 函数是否被覆盖。

标签: c++ c++11 overriding virtual c++14


【解决方案1】:

我现在想到的是有一个特殊的“计数器”变量,它将根据实现取其值,如果调用基类函数则为零。我认为这听起来有点过时的风格,并试图立即找到更好的解决方案。现在看例子:

    struct Base
    {
        virtual void func(int x, int& implemented) {implemented = 0;}

    };

    struct Deriv : Base
    {
        virtual void func(int x, int& implemented) override {implemented = 1;}
    };

如果函数在您的示例中是无效的,您也可以使用“返回代码” - 只需返回实现的值。

【讨论】:

    【解决方案2】:

    简短的回答是:不。而且肯定不是便携式的。

    更长的答案:实际上,多态性的目标是让用户无法区分功能的来源。

    即使开发人员不编写代码,编译器仍可能为派生类生成专用版本的函数(以进行更好的优化)。这甚至会抛弃检查虚拟表的非便携式实现......

    然而,另一种方法是抛弃 C++ 自动运行时多态性,而是提供一个临时实现。例如,如果您要提供自己的虚拟表/指针机制,那么您将拥有更多控制权:

    struct VirtualTable {
        typedef void (*FuncType)(void*, int);
        typedef void (*Func2Type)(void*, int);
    
        FuncType func;
        Func2Type func2;
    };
    

    你可以检查函数指针是否等于默认值。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多