与えられたインタフェースに複数の実装があるが、コンパイル時に必要な特定の実装がわかっている場合は、makeファイルを同じヘッダの異なる実装ファイルに送るだけで間違っていますか?ポリモーフィズムを達成するために、異なる実装ファイルを使用することはできますか?
例えば、自動車(Car.h)を定義するプログラムを持っている場合
// Car.h
class Car {
public:
string WhatCarAmI();
}
とビルド時に我々は、それは、フェラーリやフィアットすることのいずれかのそれぞれを与えたいと思うかどうかを知ります対応するファイル:今
// Fiat.cpp
#include "Car.h"
string Car::WhatCarAmI() { return "Fiat"; }
(予想通り)他のケースについてながら
// Ferrari.cpp
#include "Car.h"
string Car::WhatCarAmI() { return "Ferrari"; }
、私は承知しています私はフィアットとフェラーリの両方をCarのオブジェクトから派生させることができ、実行時には私が構築したいものを選ぶことができました。同様に、私はそれをテンプレート化し、コンパイル時にコンパイラを選択させることができます。しかし、この場合、2つの実装はどちらも交差してはならない別々のプロジェクトを参照します。
与えられたプロジェクトのメイクファイルで、正しい.cppを選択するだけで間違っていますか?これを行う最善の方法は何ですか?かなりハックようだ - これは静的な多型であるため
あなたはそうすることができます。それは[Pimpl Idiom]の貧弱なバージョンです(https://en.wikibooks.org/wiki/C%2B%2B_Programming/Idioms#Pointer_To_Implementation_.28pImpl.29)。 –
これは静的なポリモーフィズムなので、CRTP( 'class Fiat:public Car ')を使うと、おそらくcppファイルを取り替えるよりもはるかに慣れていて、複数のインターフェースを共存させたい場合には絶対必要です。 –
できますが、できません。これは、多形性を達成するには非常に貧弱な方法であり、デザインの選択肢は非常に貧弱です。 – Nico