C++で継承できないクラスを書く
1082 ワード
条件:継承できないクラスをC++で書きますが、このクラスはスタック上でもスタック上でもインスタンス化できます.
クラスが継承できない場合、私が最初に考えたのはこのクラスの構造関数がprivateであることです.スタック上でインスタンス化できる場合は、静的メンバー関数を使用して関数を構築する機能をシミュレートし、内部にスタック上のオブジェクトを作成し、そのオブジェクトのポインタを返すことを考えます.静的メンバー関数を使用して、動的に割り当てられたオブジェクトを解放します.静的メンバー関数を使用して、静的データ領域上のオブジェクトを作成することもできます.しかし,この方法はスタック上でインスタンス化できない.だから方法はだめだ、考え続けなさい!
継承でよろしいですか?まずクラスAを定義し、クラスAの構造関数をprivateと宣言し、クラスBをクラスAの友元クラスと宣言します.これでBクラスはAクラスを継承できますが、継承できないクラスを書きます.したがって、クラスAを継承するために仮想継承を使用する必要があります.クラス継承クラスBがある場合は、オブジェクトを構築する際にダミークラスAのコンストラクタを直接呼び出してオブジェクトのベースクラスA部分を初期化し、ダミークラステーブルポインタを初期化する必要がありますが、クラスAのコンストラクタはprivateでこのクラスでは使用できないため、このクラスはスムーズにオブジェクトを作成できないため、クラスBを継承できません.
サンプルコードは次のとおりです.
クラスが継承できない場合、私が最初に考えたのはこのクラスの構造関数がprivateであることです.スタック上でインスタンス化できる場合は、静的メンバー関数を使用して関数を構築する機能をシミュレートし、内部にスタック上のオブジェクトを作成し、そのオブジェクトのポインタを返すことを考えます.静的メンバー関数を使用して、動的に割り当てられたオブジェクトを解放します.静的メンバー関数を使用して、静的データ領域上のオブジェクトを作成することもできます.しかし,この方法はスタック上でインスタンス化できない.だから方法はだめだ、考え続けなさい!
継承でよろしいですか?まずクラスAを定義し、クラスAの構造関数をprivateと宣言し、クラスBをクラスAの友元クラスと宣言します.これでBクラスはAクラスを継承できますが、継承できないクラスを書きます.したがって、クラスAを継承するために仮想継承を使用する必要があります.クラス継承クラスBがある場合は、オブジェクトを構築する際にダミークラスAのコンストラクタを直接呼び出してオブジェクトのベースクラスA部分を初期化し、ダミークラステーブルポインタを初期化する必要がありますが、クラスAのコンストラクタはprivateでこのクラスでは使用できないため、このクラスはスムーズにオブジェクトを作成できないため、クラスBを継承できません.
サンプルコードは次のとおりです.
#include<iostream>
using namespace std;
template <typename T>
class Base
{
friend T;
private:
Base() {}
~Base() {}
};
class Finalclass : virtual public Base<Finalclass>
{
public:
Finalclass() {}
~Finalclass() {}
};
void main()
{
Finalclass *p = new Finalclass; //
Finalclass fs; //
}