我有下面的c ++ 11代码,可以正常工作,虽然我希望它会崩溃甚至无法编译。检索指向纯虚拟成员函数的指针应返回null或无效的指针,或者应被编译器阻止。我想了解它为什么起作用。
我知道还有其他(更好)的方式对此进行编码,这是一个纯粹的理论性问题,用于了解语法的作用。
#include <iostream>
#include <functional>
class Abstract
{
public:
void foo()
{
auto func = std::bind(&Abstract::virtualFoo, this);
func();
}
protected:
virtual void virtualFoo() = 0;
};
class Derived1 : public Abstract
{
private:
void virtualFoo() override
{
std::cout << "I am Derived1\n";
}
};
class Derived2 : public Abstract
{
private:
void virtualFoo() override
{
std::cout << "I am Derived2\n";
}
};
int main(int argc, char *argv[])
{
Abstract * a1 = new Derived1;
Abstract * a2 = new Derived2;
a1->foo();
a2->foo();
return 0;
}
意图很明确,我想在基类函数foo()中获得派生虚函数的指针。
但是,据我了解,它不起作用,甚至不应该使用纯虚函数进行编译。对于非纯虚函数,它应该执行基类函数。但是,看到它编译并产生预期的输出,我感到非常惊讶:它先显示“ I is Derived1”,然后显示“ I am Derived2”
&Abstract::virtualFoo
如何甚至在不知道指向实际对象的指针的情况下也可以返回有效的指针,这对于访问vtable是必不可少的?
在线C ++链接:https://onlinegdb.com/SJfku8rvV
对我来说,有效的语法应该是:
auto func = std::bind(&this->virtualFoo, this);
取消引用this
时应实际访问vtable并返回函数指针。但是c ++ 11并不这样认为。