让方法未实现是合法和良好的做法吗?

时间:2012-05-01 17:10:02

标签: c++ virtual

#include <iostream>

using namespace std;

class base
{
public:
  virtual void taunt() = 0;
  virtual void hide() = 0;
};

template <int nx, int ny>
class derivedA : public base
{
  void hide();
public:
  void taunt() { cout << "derivedA" << endl; }

  char c[nx][ny];
};

template <int nx, int ny, int nz>
class derivedB : public base
{
  void taunt();
public:

  void hide() { cout << "hide B" << end; }
  char c[nx][ny][nz];
};

int main()
{
  derived * dp = new derivedA();

  dp->taunt();

  delete dp;

  DerivedB b;

  dp = &b;

  dp->hide();

  return 0;
}

A和B都是从纯虚拟类库派生的,并且都有一个未实现的方法。保留一个未实现的方法是否合法?让一个方法未实现是可以接受的还是好的做法?还有更好的方法吗?

编辑: 我只是注意到这些类不是从base派生的。我已经改变了代码。

2 个答案:

答案 0 :(得分:5)

如果从具有纯虚方法的类派生,并且您不在派生类中重写该方法,则该派生类也将是一个抽象类。如果你没问题(例如你会进一步推导),那么你可以做到。如果你想要实例化那个派生类,那么你必须覆盖所有纯抽象方法

请注意,在您的示例中,您不是从抽象base类派生的:derivedAderivedB都是独立的类。你需要:

class derivedA : public base {
  //...
};

答案 1 :(得分:1)

不允许您实例化任何具有纯虚拟成员函数的类。您当然可以拥有这样的类,但它的任何实例都必须是子类,其中所有纯虚拟都已被赋予定义。