相关疑难解决方法(0)

C++:指向虚拟成员函数的单态版本的指针?

在C++中,可以获得指向类的(非静态)成员函数的指针,然后在对象上调用它.如果函数是虚函数,则根据对象的动态类型动态调度调用.通过显式提供包含要使用的版本的范围,也可以(不使用成员指针)以单态方式调用对象的虚拟成员函数.以下代码演示了这一点:

#include <iostream>
using std::cout; using std::endl;

struct Foo
{
    virtual void foo() { cout << 1 << endl; }
};

struct Foo2: public Foo
{
    virtual void foo() { cout << 2 << endl; }
};

int main( int, char** )
{
    Foo *foo = new Foo2;

    void (Foo::*foo_pointer)() = &Foo::foo;

    foo->foo();            // prints 2
    foo->Foo::foo();       // prints 1
    (foo->*foo_pointer)(); // prints 2
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将两者结合起来,并获得指向成员函数的单态版本的指针; 即,我想要一个指向Foo :: foo的指针,它总是调用foo的基类版本,并打印1,即使它是在Foo2上调用的.但是,我还没有找到办法做到这一点.可能吗?

(除了编写一个新的非虚函数的繁琐的手动方式,它进行单态调用,然后获得指向它的指针.)

c++ virtual-functions member-function-pointers

27
推荐指数
1
解决办法
1551
查看次数

通过基类函数指针调用派生类

我可以通过基类函数指针调用派生类,如下例所示?

我理解我的示例有效,但保证总是这样做(假设对象实际上实现了函数!),或者这只是我正在使用的编译器的特性?

通过这个逻辑,不能简单地从"CBase"(在这种情况下是空的,所以我猜没有开销)派生所有类,并忽略函数指针中的类型?

#include <iostream>

struct CBase
{ 
};

struct CDerived : CBase
{
    void MyFunction()
    {
        std::cout << "Called OK" << std::endl;
    }
};

typedef void (CBase::*FunctionPointer)();


int main()
{
    CDerived* base = new CDerived();

    FunctionPointer pointer = static_cast<FunctionPointer>(&CDerived::MyFunction);
    (base->*pointer)();

    delete base;
}
Run Code Online (Sandbox Code Playgroud)

示例用法场景:一个派生类,它在基类中带有一个或多个指向"回调"的指针.可以使用派生类来定义回调类型,从而放弃对模板的需求吗?

c++ polymorphism member-function-pointers

9
推荐指数
1
解决办法
772
查看次数

C++中是否存在多态性的替代方案?

关于动态多态性的问题中提出了CRTP.但是,据称这种模式仅对静态多态性有用.我所看到的设计似乎受到虚拟函数调用的快速阻碍,如此处暗示的那样. 加速甚至2.5倍将是太棒了.

有问题的类很简单,可以完全内联编码,但是直到运行时才会知道将使用哪些类.此外,它们可以以任何顺序链接,将性能损失归咎于伤害.

任何建议(包括如何在这种情况下使用CRTP)欢迎.

编辑:谷歌搜索提到功能模板.这看起来很有希望

c++ virtual-functions

8
推荐指数
2
解决办法
4462
查看次数

什么是调度表?我怎样才能用C实现它?

首先我要说的是我知道函数指针是如何工作的。如果您想更详细地解释它们,请继续,但是我问您的是如何使用 C 在调度表中实现它们。

我已经搜索过调度表是什么,但除了对它如何工作的模糊理解之外,我并没有真正理解任何东西。

请分享它的实际用途以及我如何用 C 创建我自己的调度表。非常感谢帮助。

c pointers function-pointers dispatch-table

3
推荐指数
1
解决办法
3256
查看次数