指向基本虚拟成员函数的指针



如果基类中的成员函数是虚拟函数并且在派生类中被重写,是否有方法在该成员函数上创建指针?

考虑如下代码

#include <iostream>
#include <functional>
struct Base
{
virtual void g() const
{
std::cout << "Base" << std::endl;
}
};
struct Derived : Base
{
virtual void g() const override
{
std::cout << "Derived" << std::endl;
}
};
int main()
{
Derived d;
(d.*(&Base::g))();
std::mem_fn(&Base::g)(d);
return 0;
}

尽管我在Base::g上做了一个指针,但它还是打印了两次"Derived"。有没有一种方法可以使函数g保持虚拟和重写,并获取将为d打印"Base"的成员函数指针?

只需调用基本函数

int main()
{
Derived d;
d.g();

Base* b = &d;
b->Base::g();

//or 
d.Base::g();
//or
auto callLater = [&d]() { d.Base::g();};
callLater();
return 0;
}

输出

Derived
Base
Base
Base

这可以成为指向函数的指针;但它需要指向所指向对象的成员函数Base::g((。

您可以定义一个从g调用的非虚拟函数real_g,因此编码

struct Base
{
void real_g() const {
std::cout << "Base" << std::endl;
}
virtual void g() const { real_g(); };
};

随后在main

std::mem_fn(&Base::real_g)(d);

请参阅虚拟方法表上的Wiki页面、此C++参考和C++标准n3337或更好的版本。还可以阅读一本好的C++编程书和C++编译器的文档,例如GCC

另请参阅这个答案(在简单的情况下,天真地解释什么是vtables(

最新更新