我的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