首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过指向虚函数的成员函数指针调用基本成员函数实现

通过指向虚函数的成员函数指针调用基本成员函数实现
EN

Stack Overflow用户
提问于 2015-04-21 16:05:20
回答 2查看 311关注 0票数 5

我有这样一种情况,在这种情况下,我想要一个指向避免动态调度的虚函数的成员函数指针。如下所示:

代码语言:javascript
复制
struct Base
{
    virtual int Foo() { return -1; }
};

struct Derived : public Base
{
    virtual int Foo() { return -2; }
};

int main()
{
    Base *x = new Derived;

    // Dynamic dispatch goes to most derived class' implementation    
    std::cout << x->Foo() << std::endl;       // Outputs -2

    // Or I can force calling of the base-class implementation:
    std::cout << x->Base::Foo() << std::endl; // Outputs -1

    // Through a Base function pointer, I also get dynamic dispatch
    // (which ordinarily I would want)
    int (Base::*fooPtr)() = &Base::Foo;
    std::cout << (x->*fooPtr)() << std::endl; // Outputs -2

    // Can I force the calling of the base-class implementation
    // through a member function pointer?
    // ...magic foo here...?

    return 0;
}

出于好奇,我之所以要这样做,是因为派生类实现使用了一个实用程序类来记忆(添加缓存)基类实现。这个实用类接受一个函数指针,当然,函数指针会动态地分派给派生最多的类,这样我就会得到无限递归。

有没有一种语法可以让我通过函数指针重现我可以用x->Base::foo()实现的静态分派行为?

EN

回答 2

Stack Overflow用户

发布于 2015-04-21 16:11:50

您可以像这样强制对Base*进行切片:

代码语言:javascript
复制
std::cout << (static_cast<Base>(*x).*fooPtr)() << std::endl; // Outputs -1
票数 1
EN

Stack Overflow用户

发布于 2015-04-21 16:24:42

你想要的属性没有独立的“成员函数指针”。与绑定成员函数最接近的是闭包:

代码语言:javascript
复制
Base * x = new Derived;
auto f = [x]() { x->Base::Foo(); }
f();

如果您的类Base是一个特殊的、一次性的用例,并且在您的控制之下,那么您可能应该向它添加某种“接受访问者”函数,以便您可以动态地传递成员调用者,如x->accept(foo_caller);等。C++14中的一个示例:

代码语言:javascript
复制
struct X
{
    template <typename F>
    auto accept(F && f)
    {
        return [this, &f](auto &&... args) {
            return f(this, std::forward<decltype(args)>(args)...); };
    }

    virtual void foo() const { std::cout << "base\n"; }
};

用法:

代码语言:javascript
复制
void call_static_foo(X * p)
{
    p->accept([](X * that){that->X::foo();});
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29766352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档