纯虚函数及其实现

纯虚函数及其实现

我的基本理解是,纯虚拟函数没有实现,但是,有人告诉我,可能有纯虚拟函数的实现。

class A {public:
    virtual void f() = 0;};void A::f() {
    cout<<"Test"<<endl;}

上面的代码可以吗?

用一个实现使它成为一个纯虚拟函数的目的是什么?


小唯快跑啊
浏览 281回答 3
3回答

不负相思意

清纯virtual函数必须以将直接实例化的派生类型实现,但是基类型仍然可以定义实现。派生类可以通过使用全作用域名称(通过调用)显式调用基类实现(如果访问权限允许的话)。A::f()在你的例子中-如果A::f()都是public或protected)。类似于:class&nbsp;B&nbsp;:&nbsp;public&nbsp;A&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;f()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;class&nbsp;B&nbsp;doesn't&nbsp;have&nbsp;anything&nbsp;special&nbsp;to&nbsp;do&nbsp;for&nbsp;f() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;so&nbsp;we'll&nbsp;call&nbsp;A's &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;note&nbsp;that&nbsp;A's&nbsp;declaration&nbsp;of&nbsp;f()&nbsp;would&nbsp;have&nbsp;to&nbsp;be&nbsp;public&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;or&nbsp;protected&nbsp;to&nbsp;avoid&nbsp;a&nbsp;compile&nbsp;time&nbsp;problem &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A::f(); &nbsp;&nbsp;&nbsp;&nbsp;}};我能想到的用例是,当存在或多或少合理的默认行为时,类设计人员希望只显式地调用这种类型的默认行为。它也可以是这样的,您希望派生类总是执行自己的工作,但也能够调用一组通用的功能。请注意,尽管它是语言允许的,但这并不是我所看到的常用的东西(而且可以这样做的事实似乎让大多数C+程序员感到惊讶,甚至是有经验的程序员)。

互换的青春

要明确的是,您误解了什么是=0;在虚拟函数之后意味着。=0表示派生类必须提供实现,而不是基类不能提供实现。实际上,当您将一个虚拟函数标记为纯函数(=0)时,提供一个定义没有什么意义,因为除非有人通过Base:function(.)显式地调用它,否则它永远不会被调用。或者如果基类构造函数调用所讨论的虚拟函数。

长风秋雁

如果您的代码应该由派生类执行,但是您不希望直接执行它-您希望强制它被覆盖。您的代码是正确的,尽管所有这些都不是经常使用的特性,而且通常只在试图定义纯虚拟析构函数时才会看到-在这种情况下必提供一个实现。有趣的是,一旦从该类派生出来,就不需要重写析构函数。因此,纯虚拟函数的一种合理用法是将纯虚拟析构函数指定为“非最终”关键字。令人惊讶的是,以下代码是正确的:class&nbsp;Base&nbsp;{public: &nbsp;&nbsp;virtual&nbsp;~Base()&nbsp;=&nbsp;0;};Base::~Base()&nbsp;{}class&nbsp;Derived&nbsp;:&nbsp;public&nbsp;Base&nbsp;{};int&nbsp;main()&nbsp;{&nbsp; &nbsp;&nbsp;//&nbsp;Base&nbsp;b;&nbsp;--&nbsp;compile&nbsp;error &nbsp;&nbsp;Derived&nbsp;d;&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP