Ruu*_*uud 3 c++ this multiple-inheritance pod reinterpret-cast
假设我有这个结构:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
Run Code Online (Sandbox Code Playgroud)
operator []应该按预期工作,因为vector_data是POD类型.预期的行为是vector_data [0]返回x,vector_data [1]返回y.
现在假设我有第二个结构:
struct more_data
{
double evil_data;
// There could be more here, data or functions
};
Run Code Online (Sandbox Code Playgroud)
并且来自这两个:
struct composed : public more_data, public vector_data
{
};
Run Code Online (Sandbox Code Playgroud)
请问这个destory运算符[]的预期行为?换句话说,派生结构中的vector_data的this-pointer是否仍然指向struct的vector_data部分,还是指向派生结构的开头?
如果它确实破坏了operator [],那么我该如何解决这个问题呢?我可以先从vector_data继承,但假设compos包含虚函数.我知道大多数编译器都将vtable放在最后,但这并不能保证.什么是最好的方法?
抛开不正确的指针算术问题(在你的假设之间填充x和y无效的可能性),这里是一个快速说明this当你使用多重继承时指针发生了什么:
#include <iostream>
using namespace std;
struct a {
int aa;
void showA() {
cerr << this << endl;
}
};
struct b {
int bb;
void showB() {
cerr << this << endl;
}
};
struct c : public a, b {
int cc;
void showC() {
cerr << this << endl;
}
};
int main() {
c x;
x.showA();
x.showB();
x.showC();
}
Run Code Online (Sandbox Code Playgroud)
showA并showB打印不同的数字; showC打印相同的数字showA,因为a在基数列表中首先列出.如果您切换a并b在那里,然后showC和showB将是相同的."魔术"在C++编译器中:它足够聪明,可以为每个成员函数提供正确的this指针.