【问题标题】:Determining whether virtual function is overloaded [duplicate]确定虚函数是否重载[重复]
【发布时间】:2015-02-16 06:53:17
【问题描述】:

假设我们有

class Base
{
    virtual void foo()
    {
        // some default implementation
    }
};

void bar(Base* b)
{
}

有没有办法判断b对象的foo函数是否从bar函数重载?

【问题讨论】:

  • 你确定你的意思是overloaded而不是overridden
  • 您要查找的单词是 overridden 顺便说一句。那是派生类重新实现相同的虚拟方法的时候。 重载 表示方法参数不同但名称相同。

标签: c++ virtual-functions


【解决方案1】:

您不想检测虚函数是否已被覆盖。

相反,在函数 bar 中,如果您想要 Base 实现,请像这样调用它

void bar( Base* p )
{
    p->Base::foo();
}

如果你想要一个虚拟调用,绑定到最派生类中的实现,像这样调用它

void bar( Base* p )
{
    p->foo();
}

【讨论】:

  • 我需要填充一个包含函数指针的结构,然后将其传递给第三方库函数。对于默认行为,我需要在该结构中填充 NULL。这就是为什么我需要确定它
  • @ArmanHunanyan:这个问题似乎与您发布的问题无关,抱歉。对于原始函数指针,您需要非成员函数或static 成员函数。此类函数不能为virtual
  • 这与我需要在 bar if (foo 被覆盖) {s.FOO_PTR = somting } else {s.FOO_PTR = NULL} 然后将 s 传递给第三方库相关
【解决方案2】:

非便携、非常脆弱的解决方案就是这样。我不会在实际程序中使用我自己的解决方案。只是好奇地想知道这是否可以完成。我会找到更优雅的方式来解决“真正的问题”。我认为,您真正的问题不是摆弄以查找函数是否重载。您在那里看到的“1”必须根据基类的布局进行调整。 1 是函数 foo 在虚拟表中的位置。确实要求您在 bar 函数内有一个方便的 Base 类实例。

#include "stdafx.h"

class Base { 
    public: 
        int l;
        virtual int foo3(){return 5;}; 
        virtual int foo(){return 0;}; 
};

class Base2 { 
    public: 
        virtual int foo2(){return 2;}; 
};

class Derived : public Base, Base2 { 
    public:
        int j;
        int k;
        virtual int foo(){return 1;}; 
        virtual int foo2(){return 5;}; 
};

void bar(Base* b)
{
    Base d;

    int* p;
    int* p2;

    p = (int*)&d;
    p2 = (int*)b;
    p = (int*)(*p);
    p2 = (int*)(*p2);

    int i = p[1];
    int k = p2[1];
    bool bOverLoaded;
    if(i == k)
    {
        bOverLoaded = false;
    }
    else
    {
        bOverLoaded = true;
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    Derived* p = new Derived();
    bar(p);
}

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 2017-08-06
    • 2023-01-07
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多