gpt4 book ai didi

c++ - 为什么子类的非重写实例方法中 "this"的类型是父类型?

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:10 26 4
gpt4 key购买 nike

我的 C++ 有点生疏,我对以下示例感到困惑。这个例子很短,所以我认为它会比我的解释更清楚,这里是:

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]

我会天真地认为,既然它是一个调用 getCellMyTable 实例,那么 getCell 调用上下文中的“this”会输入 MyTable

显然不是这样,这是为什么呢?

最佳答案

没有。 static type确实是Table<Cell> .由于您没有虚拟方法,您甚至无法访问 dynamic typeMyTable .

考虑一下:基类 Table<Cell>将为 getCell 生成相同的代码对于直接构造或作为派生类型的所有实例。那么它怎么能取决于类型 MyTable

关于c++ - 为什么子类的非重写实例方法中 "this"的类型是父类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16185028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com