我可以判断是否实现了C ++虚函数

时间:2015-10-18 13:49:12

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

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

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

2 个答案:

答案 0 :(得分:2)

简短的回答是:不。当然不是以便携的方式。

答案越长:实际上,多态性的目标是使其与功能所在的用户无法区分。

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

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

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

    FuncType func;
    Func2Type func2;
};

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

答案 1 :(得分:0)

现在我想到的是有一个特殊的&#34;柜台&#34;变量,它将根据实现获取其值,如果调用基类函数则为零。我认为这听起来有点过时了,并试着在一瞬间找到更好的解决方案。暂时查看示例:

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

    };

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

如果函数在您的示例中无效,您还可以使用&#34;返回代码&#34; - 只返回实现的价值。