2013-04-24 73 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是封闭类的类型。

相关问题