纯虚函数(当我们设置= 0
)也可以有一个函数体。
如果根本不会调用纯虚函数,为什么要为其提供函数体呢?
纯虚函数(当我们设置= 0
)也可以有一个函数体。
如果根本不会调用纯虚函数,为什么要为其提供函数体呢?
您对于不能调用纯虚函数的假设是完全不正确的。当一个函数被声明为纯虚函数时,它只意味着这个函数无法通过虚拟派发机制动态调用,但是这个同样的函数可以轻松地通过非虚拟的、直接的方式进行静态调用(即不通过虚拟派发)。
在C++语言中,当调用中使用了函数的限定名称时,即调用中指定的函数名具有“<类名>::<函数名>”的形式时,将执行虚函数的非虚拟调用。
例如:
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`
}
对于大多数纯虚函数,您是正确的。然而,对于纯虚析构函数,定义相应的析构函数实现非常重要: