gpt4 book ai didi

c++ - 从基类实例获取指向(纯)虚函数的指针

转载 作者:太空狗 更新时间:2023-10-29 20:33:27 25 4
gpt4 key购买 nike

我有以下 c++11 代码,它可以工作,但我预计它会崩溃甚至无法编译。检索指向纯虚成员函数的指针应该返回空指针或无效指针,或者应该被编译器阻止。我想了解它为什么有效。

我知道还有其他(更好的)方法来对此进行编码,这是一个纯粹的理论问题,用于理解语法的作用。

#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 am Derived1”然后“I am Derived2”

&Abstract::virtualFoo 如何返回一个有效的指针,甚至不知道指向实际对象的指针,这是访问 vtable 所必需的???

在线 C++ 链接:https://onlinegdb.com/SJfku8rvV

对我来说,一个有效的语法应该是:

        auto func = std::bind(&this->virtualFoo, this);

作为取消引用 this 实际上应该访问 vtable 并返回一个函数指针。但是 c++11 不这么认为。

最佳答案

How can &Abstract::virtualFoo return a valid pointer, without even knowing the pointer to the actual object, mandatory for accessing a vtable???

您已将函数声明为虚函数。编译器知道该函数是虚函数。该标准要求通过成员函数指针调用进行虚拟分派(dispatch)。

编译器将必要的信息存储到成员函数指针中以实现这一点。请注意,成员函数指针不一定只是指向单个地址的指针。它可以包含更多内容。

编译器实现此目的的确切方式是实现定义的。

关于c++ - 从基类实例获取指向(纯)虚函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com