gpt4 book ai didi

c++ - 类派生形式结构上的虚函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:28 25 4
gpt4 key购买 nike

我有一个派生自 C 结构的类。除了构造函数中的初始化、析构函数中的去初始化函数以及调用 C 函数的其他一些方法之外,该类没有做任何特殊的事情。基本上,它是一个普通的包装器。使用 GCC,它提示我的析构函数不是虚拟的,所以我做到了。现在我遇到了段错误。

/* C header file */
struct A
{
/* ... */
}

// My C++ code
class B : public A
{
public:
B() { /* ... init ... */ }
virtual ~B() { /* ... deinit ... */ }

void do()
{
someCFunction(static_cast<A *>(this));
}
};

我一直假设 static_cast 会返回指向基类的正确指针,删除虚拟表指针。所以情况可能并非如此,因为我在 C 函数中遇到了段错误。

通过删除 virtual 关键字,代码可以正常工作,除了我收到 gcc 警告。最好的解决方法是什么?请随意启发我:)。

最佳答案

A* 的显式和隐式转换都是安全的。既不需要显式转换,也不会在任何地方引入 vtables,或类似的东西。如果不是这种情况,该语言将根本无法使用。

I was always under the assumption that the static_cast would return the correct pointer to the base class, pruning off the virtual table pointer.

绝对正确。

只有当 delete ptr; 被调用时,析构函数才需要是 virtual,其中 ptr 的类型为 A*-或手动调用的析构函数。 A 的析构函数必须是虚拟的,但事实并非如此。

无论您的代码中有什么问题,都与显示的代码无关。您需要大大扩展样本。

关于c++ - 类派生形式结构上的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540722/

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