![]() |
1
23
声明的析构函数必须始终实现,因为实现将调用它们作为派生对象销毁的一部分。 如果其他纯虚拟函数提供有用的公共功能,但总是需要专门化,则可以实现它们。在这种情况下,通常派生类实现将对基本实现进行显式调用:
通常,如果需要使类抽象(即防止创建非派生实例),则将析构函数设为虚拟的,但该类没有其他自然纯虚拟的函数。我认为“相信我它更快”是指这样一个事实:因为作为派生对象清理的一部分调用的析构函数不需要使用vtable查找机制,所以可以利用内联实现,这与典型的虚拟函数调用不同。 |
![]() |
2
4
如果您具有派生类可以使用的公共功能。 但他们也需要做其他工作。 因此,派生类实现了虚函数并调用基础基础基础版本:
|
![]() |
3
4
刚刚发现赫伯·萨特在他的书中回答了这个问题的第一部分。 Guru of the Week #31 . |
![]() |
4
2
G'Day. 关于为基类中声明的成员函数提供默认实现,我现在能想到的唯一原因是,您希望在哪里提供行为的默认实现,作为对基类专门化的人的可能实现选择。 派生类的作者可以选择使用基类作者提供的默认实现,而不是添加自己的专门实现。 通常情况下,人们反对拥有单独的函数来提供接口和行为的默认实现,但他们仍然希望在默认实现和关联接口之间分离。 啊,刚才看到了@martin york的帖子,它提供了一个例子。 实际上,Scott Meyers在他的《有效C++》一书中对此进行了讨论。这是第一版的第36项。 高温高压 干杯, |
![]() |
5
0
因为写东西被认为是不正确的:
如果从此类派生,则仍将调用析构函数。声明所有方法纯虚拟只是为了清晰起见。你不妨这样写:
类仍然是抽象的,因为至少有一个方法是纯虚拟的。析构函数仍然是内联的。 |
![]() |
6
0
关于虚拟析构函数的速度,这是因为析构函数是在cpp文件中定义的,而不是头文件中定义的。它与大小的关系比速度的关系更大。对“大型C++软件设计”进行了详细的说明。不幸的是,我无法记住所有的细节,但我认为内联虚拟函数在vtable中被定义了多次。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |