これは短い記事です。主な目的は、いくつかの知識ポイントを説明することです。C++ クラス リストを初期化するとき、初期化された値が基本クラスで、新しいインスタンスがサブクラスの場合、それを実装する方法は次のとおりです。
#include <memory>
#include <iostream>
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
cSub(int a, int b) :m_a(a), m_b(b) {}
};
int main()
{
cBase *p = new cSub(1, 2);
std::cout << p->m_a << " " << p->m_b << std::endl;
std::getchar();
return 0;
}
このコードをコンパイルするときに問題が発生し、プロンプトが表示されます。
エラー C2614: 'cSub': メンバーの初期化が不正です: 'm_a' はベースまたはメンバーではありません
これは、インスタンスを生成するときにクラスを継承して基本クラスの変数を直接初期化することができないためです。
1: 基本クラスの変数をサブクラスに入れる もちろんこれも可能ですが、本来の設計意図に反します。
2: サブクラスを構築するときは、次のように基本クラスを明示的に構築します。
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
// cSub(int a, int b) :m_a(a), m_b(b) {}
cSub(int a, int b) :cBase{a, b} {}
};
これは実現可能です。より完璧にするために、通常はスマート ポインターに最適化して実装を改善します。完全なコードは次のとおりです。
#include <memory>
#include <iostream>
class cBase
{
public:
int m_a;
int m_b;
};
class cSub : public cBase
{
public:
// cSub(int a, int b) :m_a(a), m_b(b) {}
cSub(int a, int b) :cBase{a, b} {}
};
int main()
{
std::unique_ptr<cBase> p = std::make_unique<cSub>(1, 2);
std::cout << p->m_a << " " << p->m_b << std::endl;
std::getchar();
return 0;
}
要約:
1: スマート ポインタ、リストの初期化などはすべて C++ の基本的な演習であり、習熟するには繰り返し練習する必要があります。
2: 問題が発生した場合、回避することはできません (上記の方法 1)。chatgpt と newing の登場により、どんな問題も簡単に解決できるようになりました。でも、まだまだ練習が必要です