纯虚函数(当我们设置= 0
时)也可以有一个函数体。
为纯虚函数提供函数体有什么用?如果它们根本不被调用?
答案 0 :(得分:86)
您无法调用纯虚函数的假设绝对不正确。当一个函数被声明为纯虚拟时,它只是意味着该函数不能通过虚拟调度机制被动态调用 。然而,这个非常相同的功能可以很容易地称为静态,非虚拟,直接(没有虚拟调度)。
在C ++语言中,当在调用中使用函数的限定名称时,即在调用中指定的函数名称具有<class name>::<function name>
形式时,将执行对虚函数的非虚拟调用。
例如
struct S
{
virtual void foo() = 0;
};
void S::foo()
{
// body for pure virtual function `S::foo`
}
struct D : S
{
void foo()
{
S::foo();
// Non-virtual call to `S::foo` from derived class
this->S::foo();
// Alternative syntax to perform the same non-virtual call
// to `S::foo` from derived class
}
};
int main()
{
D d;
d.S::foo();
// Another non-virtual call to `S::foo`
}
答案 1 :(得分:26)
“有效的C ++”迈耶斯提到了一个 纯虚函数的原因 有一个身体:派生类 实现这个纯虚函数 可以在smwhere调用此实现 在他们的代码中。如果部分代码 两个不同的派生类是 类似的,移动它是有道理的 在层次结构中,即使是 功能应该是纯虚拟的。
请参阅here。
答案 2 :(得分:6)
对于大多数纯虚函数,你是对的。但是,对于纯虚拟析构函数,定义相应的析构函数实现非常重要: