sky*_*oor 162 c++ pure-virtual
我的基本理解是没有纯虚函数的实现,但是,有人告诉我可能有纯虚函数的实现.
class A {
public:
virtual void f() = 0;
};
void A::f() {
cout<<"Test"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
代码是否正常?
使其成为具有实现的纯虚函数的目的是什么?
Mic*_*urr 197
纯virtual函数必须在将直接实例化的派生类型中实现,但是基类型仍然可以定义实现.派生类可以通过使用完全范围的名称显式调用基类实现(如果访问权限允许)(通过A::f()在您的示例中调用- 如果A::f()是public或protected).就像是:
class B : public A {
virtual void f() {
// class B doesn't have anything special to do for f()
// so we'll call A's
// note that A's declaration of f() would have to be public
// or protected to avoid a compile time problem
A::f();
}
};
Run Code Online (Sandbox Code Playgroud)
我可以想到的用例是当有一个或多或少合理的默认行为时,但类设计者希望只显式调用默认行为.也可能是您希望派生类始终执行自己的工作但也能够调用一组通用功能的情况.
请注意,尽管语言是允许的,但这并不是我常用的东西(事实上它可以完成似乎让大多数C++程序员,甚至是经验丰富的程序员都感到惊讶).
Ter*_*fey 73
要清楚,你误解了什么= 0; 在虚函数意味着之后.
= 0表示派生类必须提供实现,而不是基类不能提供实现.
在实践中,当你将虚函数标记为纯(= 0)时,提供定义几乎没有意义,因为除非有人通过Base :: Function(...)明确地这样做,否则永远不会调用它.基类构造函数调用有问题的虚函数.
Kor*_*icz 17
如果你有代码应该由派生类执行,但你不希望它直接执行 - 并且你想强制它被覆盖.
您的代码是正确的,尽管总而言之这不是经常使用的功能,并且通常仅在尝试定义纯虚拟析构函数时才会出现 - 在这种情况下,您必须提供实现.有趣的是,一旦你从该类派生,你不需要覆盖析构函数.
因此,纯虚函数的一个合理用法是将纯虚拟析构函数指定为"非最终"关键字.
以下代码非常正确:
class Base {
public:
virtual ~Base() = 0;
};
Base::~Base() {}
class Derived : public Base {};
int main() {
// Base b; -- compile error
Derived d;
}
Run Code Online (Sandbox Code Playgroud)