我的C++有点生疏,我对以下示例感到困惑。这个例子很短,所以我认为这将是比我的解释更清晰,那就是:为什么在子类的非覆盖实例方法中的“this”的类型是父类型?
template <class T>
struct Table
{
T getCell()
{
T c;
c.setTable(this);
}
};
struct MyTable;
struct Cell
{
void setTable(MyTable *tbl)
{
}
};
struct MyTable : public Table<Cell>
{
};
int main(int argc, char *argv[])
{
MyTable t;
t.getCell();
}
见http://ideone.com/1MhVNc进行测试,编译器说:
prog.cpp: In instantiation of ‘T Table<T>::getCell() [with T = Cell]’:
prog.cpp:30:15: required from here
prog.cpp:7:9: error: invalid conversion from ‘Table<Cell>* const’ to ‘MyTable*’ [-fpermissive]
prog.cpp:15:10: error: initializing argument 1 of ‘void Cell::setTable(MyTable*)’ [-fpermissive]
prog.cpp:8:5: warning: no return statement in function returning non-void [-Wreturn-type]
我naivly觉得不是,因为它是一个MyTable的实例调用getCell, “本” 在getCell通话的情况下将有型MyTable的。
显然不是这种情况,为什么?
除非您使用强制转换,否则您可以从派生类转换为基类,但不能转换其他方式。 – 2013-04-24 06:59:56