多重继承和this指针
Multiple inheritance and the this pointer
假设我有这个结构体:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
操作符[]应该按预期工作,因为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
};
然后像这样推导出
struct composed : public more_data, public vector_data
{
};
这会破坏操作符[]的预期行为吗?换句话说,派生结构体中vector_data的this指针是否仍然指向结构体的vector_data部分,还是指向派生结构体的开始?
如果它销毁操作符[],那么我如何解决这个问题?我可以先从vector_data继承,但假设组合包含虚函数。我知道大多数编译器把虚函数表放在最后,但这并不能保证。最好的方法是什么?
抛开你不正确的指针算术问题(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();
}
showA
和showB
打印不同的数字;showC
与showA
打印相同的数字,因为a
在碱基列表中列在第一位。如果您将a
和b
切换到这里,那么showC
和showB
将是相同的。"魔力"在于c++编译器:它足够聪明,可以给每个成员函数一个正确的this
指针。
可能你想要的是:
struct vector_data
{
union
{
struct
{
double x, y;
};
double data[2];
};
double& operator[](size_t index)
{
return data[index];
}
}
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 关于C++中具有多重继承"this"指针的说明
- Doees the 'this' 指针参与虚函数的多态行为
- 指针'this+1' C++中指的是什么?
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- Lambda 函数捕获错误的指针"this"
- 调用类的方法时,类的指针"this"变为 null C++
- 指针'this'可以是共享指针吗?
- 如何在C++中为指针'this'赋值
- C++:指针"this"没用吗?
- 指针"this"有什么问题?
- 将指针'this'传递为 LPARAM
- 错误 C2663:指针'this'重载没有合法转换
- C++ : 了解指针"this"
- 更改对象的指针'this'以指向不同的对象
- C++编译器是为所有成员方法生成指针"this"还是仅为引用成员的方法生成指针?
- 使用指针和不使用指针"this"有区别吗?
- 将enable_shared_from_这个基于类的指针(this)存储在itelf中
- 创建指向对象的指针"this"
- 如何在类中取消初始化指针"this"?