首页 > 解决方案 > 有没有办法让子班省略父母不必要的成员?

问题描述

在以下示例中(coliru 链接)有 2 个子类Child_pubChild_pro,它们基本相同,只是它们继承自不同的父类:

继承自的类Parent_prot可以访问该int成员v,而继承自的类Parent_priv则没有,但它仍然具有其体积。

所以我的问题是:即使这private v对子类没有任何影响,为什么编译器不能从子类中优化它?为什么我的示例不能在第二种情况下4打印?sizeof哪条 C++ 法律禁止这样做?

#include <iostream>

class Parent_priv {
    private: int v;
};

class Parent_prot {
    protected: int v;
};

class Child_priv final : public Parent_priv {
    int x;
};

class Child_prot final : public Parent_prot {
    int x;
};

int main() {
    Child_prot child_prot;
    Child_priv child_priv;
    std::cout << "sizeof(child_prot) = " << sizeof(child_prot) << '\n'; // prints 8 on my system
    std::cout << "sizeof(child_priv) = " << sizeof(child_priv) << '\n'; // also 8
}

有没有办法让编译器(我们同时使用,GCC 和 Clang)优化 child_priv sizeof 4?

当然,在我们的真实代码中这些父类还有更多,所以不继承不是一种选择。


上下文:在我们的代码中,我们通过 TCP 发送大量类似的子类,这些子类使用来自其父级的不必要的大量数据,使用依赖于sizeof. 我们必须为所有这些子类实现自定义序列化,手动省略不需要的成员变量,这显然是我们不喜欢的。

标签: c++inheritancec++17

解决方案


不,你不能那样做,有充分的理由

从 Parent_prot 继承的类可以访问该 int 成员 v,而从 Parent_priv 继承的类没有,但它仍然具有它的体积。

Child_priv不能直接访问Parent_priv::v,但可能是成员函数或Parent_priv使用它的朋友。

如果没有使用Parent_priv::v,为什么首先声明它?

编译器应该如何区分您不想删除的数据成员和我添加以使填充显式的数据成员?


推荐阅读