gpt4 book ai didi

c++ - 实现细节继承?

转载 作者:行者123 更新时间:2023-12-05 04:21:55 24 4
gpt4 key购买 nike

我有只包含数据的结构,一个最小的例子是

struct A{
int a;
};

struct B{
int a;
int b;
};

我现在意识到在使用这两个结构后,A 始终应该是 B 的子集。因此,我想将这些结构耦合在一起,这样 A 中的任何更改都会反射(reflect)在 B 中。

最明显的方法是继承,所以

struct B: public A{
int b;
};

但是,我不希望任何意外的对象切片,所以我也希望 B 不明显地子类型 A。基本上,我不希望用户知道 B 扩展了 A,它应该隐藏为实现细节.

我知道标准是“优先组合而不是继承”,但这会使访问 B 的字段就像“B.inner.a”一样,出于各种原因我真的不想要它。正如我之前所说,我希望将 B 是 A 的超集这一知识作为实现细节。

到目前为止,我对 C++ 继承的唯一了解是它可以是 public、protected 或 private,但这些修饰符都没有帮助我。有什么语言特性或标准做法可以帮助我吗?

最佳答案

如果目标是防止对象切片,显式删除适当的构造函数和赋值运算符就足够了。

struct B;

struct A{
int a=0;

A();

A(const B &)=delete;

A &operator=(const B &)=delete;
};

struct B : A {
int b=0;
};



B b1, b2;

A a1, a2;

void foo()
{
b1=b2; // Ok.
a1=a2; // Ok.

a1=b1; // Error.

B b3{b2}; // Ok.
A a3{a2}; // Ok.

A b4{b1}; // Error
}

唯一的缺点是失去了方便的聚合初始化,需要使用显式构造函数来弥补。

关于c++ - 实现细节继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74133346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com