我遇到的问题是多态类:动物类有一个函数“virtual animal* get() = 0;” 在狗类中定义为"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;
}