【问题标题】:c++ pure virtual functions with a body时间:2019-05-10 标签:c++pure virtual functions with a body
【发布时间】:2013-08-27 09:13:25
【问题描述】:

我最近了解到,在 C++ 中,纯虚函数可以有一个主体。

我知道虚函数体存在是因为我想从派生类中调用她,但是我可以这样做吗?

class Base{
    int x;
  public:
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      void print(){
          Base::print();
          cout << y;
      }
};

结果会是:x的值,然后y的值?

我真正的意思是函数 Base::print() 会知道从 Derived 类中的函数获取 x 的值????

【问题讨论】:

  • @kol : 你的编译器。
  • @kol:是的,它们可以有一个甚至可以调用的主体。 :) ""Effective C++" Meyers 提到了一个纯虚函数有一个主体的原因:实现这个纯虚函数的派生类可以在它们的代码中调用这个实现。如果两个不同的派生类的部分代码是相似的那么在层次结构中向上移动它是有意义的,即使函数应该是纯虚拟的。”
  • 究竟做了what的结果?此外,Base::print() 不会从 Derived 中的函数获取任何值,因为 Derived 没有返回任何值的函数 - 您可能需要改写该部分。

标签: c++


【解决方案1】:

抽象函数当然可以有一个实现,并且在抽象析构函数的情况下,甚至要求该函数仍然被实现(毕竟,使析构函数virtual 并不意味着只有派生的析构函数被调用)。 ...并且抽象函数的实现仍然只是一个可以访问其类成员的普通函数。

x 在您的示例中是 Base 的成员。 Base::print() 可以访问 Base 的私人成员有什么令人惊讶的?

【讨论】:

    【解决方案2】:

    以下代码的输出将是“12”,所以是的,带有主体的纯虚函数将被调用,然后是派生的打印。所以,是的,结果将是:x 的值,然后是 y 的值,正如您所猜测的那样。这是有效的 C++,是的,它会知道如何在该上下文中获取“x”。

    Effective C++" Scott Meyers 提到了一个纯虚函数有一个主体的原因:实现这个纯虚函数的派生类可以在它们的代码中调用这个实现。如果两个不同的派生类的部分代码是相似的那么在层次结构中向上移动它是有意义的,即使函数应该是纯虚拟的。

    #include <iostream>
    
    using namespace std;
    
    class Base{
        int x;
      public:
        Base(): x(1) {}
        virtual void print()=0;
    };
    
    void Base::print(){
      cout << x;
    }
    
    class Derived : public Base{
          int y;
      public:
          Derived(): Base(), y(2) {}
          void print(){
              Base::print();
              cout << y;
          }
    };
    
    int main()
    {
        Derived d;
        d.print();
        return 0;
    }
    

    输出:12

    【讨论】:

    • @user2713409:这能回答你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多