【问题标题】:Is it legal and good practice to leave methods unimplemented?不实施方法是否合法和良好的做法?
【发布时间】:2012-05-01 17:10:01
【问题描述】:
#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 都是从纯虚拟类基派生的,并且都有一个未实现的方法。不实施一种方法是否合法?不实施一种方法是可以接受的还是好的做法?有更好的方法吗?

编辑: 我刚刚注意到这些类不是从基类派生的。我已经更改了代码,所以它确实如此。

【问题讨论】:

  • “A 和 B 都派生自纯虚类基” -- 不,它们不是。他们都是毫无根据的。
  • 你不能用一个未实现的方法来实例化一个类。在随机编译器上试一下,你会看到编译错误。
  • derived * dp = new derivedA();derived 不是类型,derivedA() 是非法的:derivedA&lt;4, 5&gt;()
  • 说或希望你的类是从某个基类派生的并不是这样。您需要将基类指定为class derivedA : public base { ... }; 这样做并尝试在任何编译器上编译您的代码,您将自己回答您的问题。
  • @BorisStrandjev:不正确。只要您不尝试调用这些方法,就可以使用未实现的方法实例化一个类。这通常通过复制构造函数来完成,以使类不可复制。不能实例化的是纯虚函数的类。

标签: c++ virtual


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    不允许实例化任何具有纯虚成员函数的类。你当然可以拥有这样一个类,但它的任何实例都必须是所有纯虚都已定义的子类。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2021-05-06
      • 1970-01-01
      • 2013-06-16
      • 2013-01-18
      • 2016-04-29
      相关资源
      最近更新 更多