2 つのクラスと無料の関数で基本的なことを試しています。まず、2 つのクラスがあります。
struct BASE{
BASE(int a = 0):a_(a){};
virtual ~BASE(){};
virtual void foo(){std::cout << "BASE " << std::endl;}
int a_;
};
struct DERIVED: public BASE{
DERIVED():BASE(){};
void foo(){std::cout << "DERIVED " << std::endl;}
};
次に、std::vector (または boost::ptr_vector) を埋めます。
std::vector<BASE* > vec;
vec.push_back( new BASE(2));
vec.push_back( new DERIVED);
関数 foo を呼び出すと、仮想のものはうまく機能しませんが、2 つの無料関数を作成すると、次のようになります。
void foo(BASE* a, DERIVED* b){
std::cout << " mix base/derived " << std::endl;
}
void foo(BASE* a, BASE* b){
std::cout << " full base " << std::endl;
}
私が行った場合
foo(vec[0], vec[1]); //failed
メッセージを受け取ります
full base
私は BASE* のベクトルを持っているので、それは論理的ですが、私のフリー関数への適切な呼び出しを取得するためにとにかく存在しますか? 継承が必要なので、このコンテナーをいっぱいにする必要があるため、2 つのクラスを実際に分離することはできません。
さらに、最後にベクトルがランダムにいっぱいになるため、適切にキャストする方法を事前に知ることはできません。