- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑这段代码:
class A {
public:
void fun() {}
};
class B : public A {
public:
void fun() {}
};
int main()
{
A *p = new B;
delete p;
}
A 类和 B 类不是多态的,并且两个类都没有声明析构函数。如果我使用 g++ -Wall
编译这段代码,GCC 编译器会愉快地编译代码。
但是,如果我将 virtual
添加到 A 中的 void fun()
,编译器会发出此警告:“正在删除多态类类型‘A’的对象,它具有非虚拟析构函数可能会导致未定义的行为”。
我非常清楚使用非虚拟析构函数的危险。但是上面的代码让我想知道两件事:
编辑
看来我需要澄清困扰我的事情:
上面的代码没有声明析构函数。
如果我声明一个虚函数,编译器会提示缺少虚析构函数。我的结论是:如果该类是多态的,如果 delete p
要正常工作,我需要编写一个虚拟析构函数。
但是如果我没有声明虚函数(如上面的初始示例),编译器不会提示缺少虚析构函数。我的结论是:如果类不是多态的,我不需要编写虚拟析构函数,delete p
无论如何都会正常工作。
但最后一个结论在我看来直觉上是错误的。这是错的吗?编译器应该在这两种情况下都提示吗?
最佳答案
根据 PaulMcKenzie 和 KerrekSB 的评论,这里是对原帖中两个问题的回答:
这方面的背景可以在 C++11 标准的 §5.3.5 中找到,其中说,“如果要删除的对象的静态类型与其动态类型不同,则静态类型应为基类要删除的对象的动态类型的类,静态类型应具有虚拟析构函数,否则行为未定义。” (斜体是我的。)
关于c++ - 非多态基类中的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22881085/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!