带有正文的c ++纯虚函数

时间:2013-08-24 10:48:15

标签: c++

我最近才知道在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值?

2 个答案:

答案 0 :(得分:3)

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

有效的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

答案 1 :(得分:2)

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

x是您示例中Base的成员。 Base::print()有权访问Base的私人成员吗?

令人惊讶