【发布时间】:2011-07-25 19:31:47
【问题描述】:
纯虚函数(当我们设置= 0)也可以有函数体。
如果根本不调用纯虚函数,那么为纯虚函数提供函数体有什么用?
【问题讨论】:
-
对不起!我对这个论坛上的术语有些陌生。我已经接受了我认为正确的答案。感谢您的建议。
标签: c++ pure-virtual
纯虚函数(当我们设置= 0)也可以有函数体。
如果根本不调用纯虚函数,那么为纯虚函数提供函数体有什么用?
【问题讨论】:
标签: c++ pure-virtual
您认为不能调用纯虚函数的假设是绝对错误的。当一个函数被声明为纯虚拟时,它仅仅意味着这个函数不能通过虚拟调度机制动态地被调用。然而,同样的函数可以很容易地被调用静态、非虚拟、直接(没有虚拟调度)。
在 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`
}
【讨论】:
“Effective C++”迈耶斯提到了一个 纯虚函数的原因 有一个主体:派生类 实现这个纯虚函数 可以在哪里调用这个实现 在他们的代码中。如果部分代码 两个不同的派生类是 类似然后移动它是有意义的 在层次结构中,即使 函数应该是纯虚函数。
见here。
【讨论】:
对于大多数纯虚函数,您是对的。但是,对于纯虚析构函数,定义相应的析构函数实现实际上很重要:
【讨论】: