加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 多重继承和this指针

发布时间:2020-12-16 09:39:27 所属栏目:百科 来源:网络整理
导读:假设我有这个结构: struct vector_data{ double x,y; double operator[](size_t index) { return * (static_castdouble*(static_castvoid*(this)) + index); }}; operator []应该按预期工作,因为vector_data是POD类型. 预期的行为是vector_data [0]返回x,ve
假设我有这个结构:

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编译器中:它足够聪明,可以为每个成员函数提供正确的指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读