私が抱えている問題は、ポリモーフィック クラスにあります。アニマル クラスには、「virtual animal* get() = 0;」という関数があります。これは、dog クラスで"dog* get() { speak2(); return this; }"として定義されています。
少し前に、戻り値の型をこのように変更することは合法であると読んだことがありますが、期待どおりに動作しないようです: get 関数が呼び出されると、期待される値が出力されますが、戻り値を代入しようとすると無効な変換エラーが発生し、 speak2()関数を呼び出そうとすると、そのようなメンバーがないと表示されます。
私が探しているのは、「barn.front()->get()->speak2();」の行に沿って何かを呼び出せるようにすることです。. dynamic_casts やそのようなキャストなしでこれに似たものを達成する方法はありますか?
読みやすいように論理的な方法でクラスに名前を付け、次のコード全体にコメントの形式でいくつかのメモを追加しました。
#include <iostream>
#include <vector>
using namespace std;
class animal
{
public:
virtual ~animal() {}
virtual void speak1() = 0;
virtual animal* get() = 0;
};
class dog : public animal
{
public:
void speak1() { cout << "print-speak1!"; }
void speak2() { cout << "print-speak2!"; }
dog* get() { speak2(); return this; }
};
int main()
{
vector<animal*> barn;
barn.push_back(new dog());
barn.front()->speak1(); // prints "print-speak1!"
barn.front()->get(); // prints "print-speak2!"
barn.front()->get()->speak2();
// error: 'class animal' has no member named 'speak2'
// but then why does "barn.front()->get();" print "print-speak2!"?
dog* dogptr = barn.front()->get();
// error: invalid conversion from 'animal*' to 'dog*' [-fpermissive]
dogptr->speak2();
// for the sake of -Werror=unused-variable
for(vector<animal*>::iterator i = barn.begin(); i != barn.end(); ++i)
{
delete *i;
}
barn.clear();
return 0;
}