多型オブジェクトの型を実行時に決定する必要があるプロジェクトを処理しようとしているので、型変換できます。 私が何を意味するかの例:C++実行時に多態性オブジェクトの型を決定する
class A{
};
class B: public A{
public:
void foo(){
printf("B::foo()\n");
}
};
その後、私は基本的に、このようなとして格納されているBオブジェクトの束があります:
std::vector<A*> v;
v.push_back(new B());
をそして、私のように定義された特定のオーバーロードされたメソッドを呼び出す必要があります:
void bar(B* b){
b->foo();
}
v
に格納されているオブジェクトを渡した後。私が午前の問題は、私の実際のユースケースでは、私はコンパイル時にB
の種類を知らないので、私はちょうどbar((B*)v.get(0));
ソリューション私が考えていると言ってbar
を呼び出すことができないということです私は、それぞれのオブジェクトが実行時にある型を何らかの形で決定する必要があるかもしれないので、それをキャストしてbar
に渡すことができます。
私が今までに試した解決策は、decltype
を使用することでしたが、実行時に渡された値ではなく、渡された値の静的型を返すだけで機能しませんでした。
また、私はできるだけ小さくしたいので、このプロジェクトには第三者図書館を使用したくありません。
ありがとうございました。
編集:私は私は私は私の問題を記述したときに私は何を意味するのかで十分に明確だったとは思わない
。私の実際のユースケース(ここに投稿しようと少し長いですが、必要に応じてその部分を投稿することはできますが)は、基本クラス(ここではA
と表示されています)があるライブラリを作成しようとしています。ユーザーによって独自のカスタムクラス(ここではB
と表されます)に拡張されます。私の例では、B::foo()
は、単にA
の各サブクラスが、後で(bar
というように)いくつかの方法で処理される独自のデータメンバーをどのように持つことができるかを表しています。これはまた、A
が単純にいくつかの仮想foo
メソッドを持つことができない理由です。
B
はユーザ定義であると考えられているので、コンパイル時には何か分かりませんが、リンク時(リンクは後で来るので)で行います。だから、私が理解しているから、B
の可能性を知る必要があるので、dynamic_cast
(サムとレミーが提案したように)の使用はうまくいきません。それは私にとってうまくいくものに非常に近いものでしたが。すべての可能なサブクラス(プリプロセッサのマクロやテンプレートなど)を得る方法があれば、これはうまくいくと思います。
私はこの時間をより良く説明してくれることを願っています。ご協力いただきありがとうございます。
編集2:別の明確化のポイント:私が取り組んでいる実際のプロジェクトでは、ユーザーが独自のB
クラスを作成し、それらのカスタムクラスで動作するようにオーバーレイすることが欲しいだけです。ただし、私はbar
に電話する必要はありません。むしろ、bar
を基本クラス(私が定義する)から呼び出させたいと思います。それが私のようにこれをやろうとする主な理由です。それは、私ができるかどうかを確認する。
すべてをクリアすることを希望します。ありがとうございました。
可能な重複[なぜ我々はC++での仮想メソッドが必要なのでしょうか?](http://stackoverflow.com/questions/2391679/why-do-we-need-virtual-methods-in-c) –
あなたの編集から、派生クラスに存在するデータメンバーへの完全なアクセスを提供する、 'virtual'メンバーから 'class A 'への正しい方法が正しいように見えます。このようなアクセスには、実行時の型情報などが含まれている可能性があります。 – Walter