c – 多重继承和this指针

c – 多重继承和this指针,第1张

概述假设我有这个结构: struct vector_data{ double x, y; double& operator[](size_t index) { return * (static_cast<double*>(static_cast<void*>(this)) + index); }}; operator []应该按预期工作,因为vec 假设我有这个结构:

struct vector_data{    double x,y;    double& operator[](size_t index)    {        return * (static_cast<double*>(static_cast<voID*>(this)) + index);    }};

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};

并且来自这两个:

struct composed : public more_data,public vector_data{};

请问这个destory运算符[]的预期行为?换句话说,派生结构中的vector_data的this-pointer是否仍然指向struct的vector_data部分,还是指向派生结构的开头?

如果它确实破坏了operator [],那么我该如何解决这个问题呢?我可以先从vector_data继承,但假设compos包含虚函数.我知道大多数编译器都将vtable放在最后,但这并不能保证.什么是最好的方法?

解决方法 抛开不正确的指针算术问题(x和y之间填充的可能性使您的假设失效),这里是一个快速说明当您使用多重继承时该指针发生了什么:

#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在base列表中首先列出.如果你在那里切换a和b,那么showC和showB将是相同的. “魔术”在C编译器中:它足够聪明,可以为每个成员函数提供正确的指针.

总结

以上是内存溢出为你收集整理的c – 多重继承和this指针全部内容,希望文章能够帮你解决c – 多重继承和this指针所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1214421.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存