9

「Node」と呼ばれる空の基本クラスを作成し、「DecisionNode」や「Leaf」など、これから派生した他のクラスを作成したいと考えています。これを行うのは理にかなっており、ポリモーフィズムを利用して、コンパイル時に何がメソッドに渡されるかを知らなくても、これらのさまざまな種類のノードをメソッドに渡すことができますが、各派生クラスは状態やメソッドを共有しません。

基本クラスに追加の純粋仮想メソッドを作成せずにこれを実装する最良の方法は、混乱を招くため、コンストラクターを純粋仮想にすることであると考えました。したがって、クラス「Node.h」のヘッダー ファイルに次のように記述しました。

class Node {
 private:
  virtual Node();
};

そして「Node.cpp」で私は書いた:

#include "Node.h"
virtual Node::Node() = 0;

この実装では、Node が別のクラスによってインスタンス化されるのを防ぎます。これは、唯一のコンストラクターがプライベートであり、純粋な仮想指定子を使用してクラスが抽象であることを示すためです。ただし、これによりコンパイラエラーが発生します。

Node.h:6:21: error: return type specification for constructor invalid
Node.h:6:21: error: constructors cannot be declared virtual [-fpermissive]

私の質問は: 空の抽象基本クラスを作成するきちんとした方法はありますか?

4

6 に答える 6

9

コンストラクターを仮想にすることはできません。他の純粋仮想関数が必要ない場合は、デストラクタを純粋仮想にすることができます。

class Node
{
public:
    virtual ~Node() = 0;
};

Node::~Node()
{
  // Compulsory virtual destructor definition,
  // even if it's empty
}
于 2012-12-21T11:42:25.580 に答える
7

C++ は仮想コンストラクターをサポートしていません。

§ 12.1 コンストラクター

12.1.4 コンストラクターは、仮想 (10.3) または静的 (9.4) であってはなりません。

以下のコードはコンパイルされません:

virtual Node::Node() = 0;

私の質問は: 空の抽象基本クラスを作成するきちんとした方法はありますか?

はい、デストラクタを純粋仮想関数にし、デストラクタ関数の定義も提供します

class Node 
{
public:
    virtual ~Node()=0
    {
    }
};
于 2012-12-21T11:48:45.537 に答える
4

仮想デストラクタを作成し、「空の」実装も提供します。

class Node {
    virtual ~Node() = 0;
}

Node::~Node() {}  // You will get linker error if you do not have this

他の選択肢は、他の人がコメントしているように、コンストラクターを保護することです。2つの違いについては、この質問も参照してください。保護されたコンストラクタと純粋な仮想デストラクタ

編集純粋な仮想デストラクタを使用している理由を文書化してください。コード自体はこの点で不可解であり、この「トリック」を知らない人にはわかりません。

編集 2コンストラクターはprotectedではなくである必要がありprivateます。コンストラクターが の場合、継承できませんprivate

于 2012-12-21T11:40:49.477 に答える
0

C++ では、コンストラクターをvirtual. 誰かが基底クラスをインスタンス化できないようにするには、次のように保護されたコンストラクターを指定します。

class Node {
protected:
  Node() {}
};

抽象的ではありませんが、派生クラスのみがそのインスタンスを作成できます。

于 2012-12-21T11:40:37.280 に答える
0

単に:

class Node 
{
protected:
    Node()
    {
    }
public:
    virtual ~Node()
    {
    }
}
于 2012-12-21T11:40:50.287 に答える
0

あなたがやろうとしていることは

class Node {
 private:
  virtual Node();
};
and in "Node.cpp" I wrote:

#include "Node.h"
// This is the error as your class name and function name i.e. same so compiler assumes 
// that this as a constructor and as per the c++ standard a constructor can not have 
// return type as well as can not be virtual
virtual Node::Node() = 0;

したがって、仮想ディストラクターを ** virtual ~Node() = 0;** として作成します

于 2012-12-21T12:25:49.563 に答える