C++ でプログラミングを始めてから 3 年が経ちました。ポリモーフィズムが機能していません。 は、 と のオブジェクトをに追加すると オブジェクトにmap<string, Base>
変換するため、と で設定した値ではなく、空の文字列を返します。非常に大まかな擬似コードは次のとおりです。ArmyBase
NavyBase
Base
map
GetDescription()
ArmyBase::SetDescription()
NavyBase::SetDescription()
class Base
{ protected:
string STR__Description; // Pardon my non-standard style
public:
virtual
string GetDescription()
{ return STR__Description;
}
void SetDescription( string str__Description )
{ STR__Description = str__Description;
}
}
class ArmyBase: public Base
{ public:
string GetDescription()
{ return STR__Description + " (Army)";
}
}
class NavyBase: public Base
{ public:
string GetDescription()
{ return STR__Description + " (Navy)";
}
}
メモリリークが発生するようmap<string, Base*>
に思えますが、プロジェクトの途中で使用するようにアップグレードしたくありませんshared_ptr
。 派生クラスのインスタンスを適切に「破棄」するコンテナーに格納するとmap
、メモリ リークのリスクなしにポリモーフィズムにポインターを使用できるようになりますか?
Base base;
ArmyBase base_Army;
set<ArmyBase> set__ArmyBases;
map<string, Base*>::iterator iter_Bases;
map<string, Base*> map__Bases;
NavyBase base_Navy;
set<NavyBase> set__NavyBases;
...
while( ... )
{ base_Army = ArmyBase();
base_Navy = NavyBase();
...
set__ArmyBases.insert( base_Army );
map__Bases.insert( pair<string, Base*>( "Boca Raton", &base_Army ) );
...
set__NavyBases.insert( base_Navy );
map__Bases.insert( pair<string> Base*>( "NAS Pensacola", &base_Navy ) );
...
base = iter_Bases->second;
std::cout << ..." " << base->GetDescription() << std::endl;
}
からの望ましい出力map__Bases
:
Boca Raton ... (Army)
NAS Pensacola ... (Navy)
...