両方のクラスが抽象クラスから派生している別のクラスへの参照を取得するメンバー関数を使用してクラスを作成したいと思います。addElem()を実装していないため、クラスContainerが抽象であるというコンパイラエラーが発生します。
class Ielem
{
public:
virtual void action() = 0;
};
class Elem: public Ielem
{
public:
void action() {};
void extra() {};
};
class Icontainer
{
public:
virtual void addElem(Ielem &elem) = 0;
};
class Container: public Icontainer
{
public:
void addElem(Elem &elem) { elem.extra(); };
};
int main(int argc, char* argv[])
{
Elem e;
Container c;
c.addElem(e);
return 0;
}
Elemへの参照はIelemへの参照でもあるため、これは機能するはずです。Container::addElemにIelemへの参照を取得させるとコンパイルされます。ただし、Container :: addElem()は、使用している組み込みコンパイラで使用できないdynamic_cast、またはタイプセーフではない通常のキャストを使用しない限り、Elem :: extra()を呼び出すことはできません。
提案?