2013-04-24 71 views
0

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

顯然不是這種情況,爲什麼?

+0

除非您使用強制轉換,否則您可以從派生類轉換爲基類,但不能轉換其他方式。 – 2013-04-24 06:59:56

回答

6

沒有。 static type確實是Table<Cell>。由於您沒有虛擬方法,因此您甚至無法訪問MyTabledynamic type

請考慮:基類Table<Cell>將爲所有直接構建或派生類型的實例生成getCell的相同代碼。那麼它怎麼能取決於MyTable的類型?

+0

當然,謝謝。最近我一直在做太多PHP的工作:) – djfm 2013-04-24 18:29:28

1

我會天真地想,因爲它是一個MyTable實例調用getCell,getCell調用的上下文中的「this」將具有類型MyTable。

編譯器在編譯Table時應該怎麼知道MyTable

顯然不是這樣的,爲什麼?

因爲它不可以。

this是封閉類的類型。

相關問題