- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个派生自 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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!