1

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

4

2 回答 2

3

以下代码的输出将是“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

于 2013-08-24T11:02:05.613 回答
2

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

xBase您示例中的成员。Base::print()访问 的私人成员有什么令人惊讶的Base

于 2013-08-24T10:59:17.937 回答