为了账号安全,请及时绑定邮箱和手机立即绑定

纯虚函数及其实现

纯虚函数及其实现

C++
小唯快跑啊 2019-07-27 15:15:27
纯虚函数及其实现我的基本理解是,纯虚拟函数没有实现,但是,有人告诉我,可能有纯虚拟函数的实现。class A {public:     virtual void f() = 0;};void A::f() {     cout<<"Test"<<endl;}上面的代码可以吗?用一个实现使它成为一个纯虚拟函数的目的是什么?
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

清纯virtual函数必须以将直接实例化的派生类型实现,但是基类型仍然可以定义实现。派生类可以通过使用全作用域名称(通过调用)显式调用基类实现(如果访问权限允许的话)。A::f()在你的例子中-如果A::f()都是publicprotected)。类似于:

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();
    }};

我能想到的用例是,当存在或多或少合理的默认行为时,类设计人员希望只显式地调用这种类型的默认行为。它也可以是这样的,您希望派生类总是执行自己的工作,但也能够调用一组通用的功能。

请注意,尽管它是语言允许的,但这并不是我所看到的常用的东西(而且可以这样做的事实似乎让大多数C+程序员感到惊讶,甚至是有经验的程序员)。




查看完整回答
反对 回复 2019-07-28
?
互换的青春

TA贡献1797条经验 获得超6个赞

要明确的是,您误解了什么是=0;在虚拟函数之后意味着。

=0表示派生类必须提供实现,而不是基类不能提供实现。

实际上,当您将一个虚拟函数标记为纯函数(=0)时,提供一个定义没有什么意义,因为除非有人通过Base:function(.)显式地调用它,否则它永远不会被调用。或者如果基类构造函数调用所讨论的虚拟函数。



查看完整回答
反对 回复 2019-07-28
?
长风秋雁

TA贡献1757条经验 获得超7个赞

如果您的代码应该由派生类执行,但是您不希望直接执行它-您希望强制它被覆盖。

您的代码是正确的,尽管所有这些都不是经常使用的特性,而且通常只在试图定义纯虚拟析构函数时才会看到-在这种情况下提供一个实现。有趣的是,一旦从该类派生出来,就不需要重写析构函数。

因此,纯虚拟函数的一种合理用法是将纯虚拟析构函数指定为“非最终”关键字。

令人惊讶的是,以下代码是正确的:

class Base {public:
  virtual ~Base() = 0;};Base::~Base() {}class Derived : public Base {};int main() { 
  // Base b; -- compile error
  Derived d; }



查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 279 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信