我正在阅读 Scott Meyers 的Effective C++,我在关于继承的部分。他说过
纯虚函数仅指定接口的继承。
简单(不纯)虚函数指定接口继承加上默认实现的继承。
现在,考虑以下两个类:
struct A {
virtual void foo() = 0;
};
void A::foo(){ std::cout << "Default foo" << std::endl; }
struct B : A{
virtual void foo(){ A::foo(); std::cout << "Derived foo" << std::endl; }
};
我们仍然可以像我在示例中所做的那样为纯虚函数提供默认实现,并通过qualified-function-call-expression
. 我们可以对不纯的虚函数做几乎相同的事情
struct A {
virtual void foo(); //No longer pure virtual
};
void A::foo(){ std::cout << "Default foo" << std::endl; }
struct B : A{
virtual void foo(){ A::foo(); std::cout << "Derived foo" << std::endl; }
};
如果我不定义不纯虚函数如下:
struct A {
virtual void foo();
};
struct B : A{
virtual void foo(){ std::cout << "Derived foo" << std::endl; }
};
它会工作得很好。
那么,纯虚函数的唯一目的是使类抽象(不可实例化)?