gpt4 book ai didi

c++在子类和切片中重新定义类型

转载 作者:行者123 更新时间:2023-11-30 03:08:03 25 4
gpt4 key购买 nike

#include <string>
#include <iostream>

class a { public: int x;};
class b : public a {public: int x; } ;

int main()
{
b bee;
bee.x = 3;

a ay = bee;
std::cout << std::endl << ay.x << std::endl;


}

上面的代码在 clang 3.0 和 g++ 4.5 中编译良好。但是输出是垃圾(--即不是三个)。由于编译器似乎不介意,我如何让代码运行?

其次,如果有某种方法可以使上述切片/转换正常工作,那么如果我执行以下操作会有多糟糕,前提是存在这样做的充分理由:

class c : public a { public: uint64_t x; };

为什么我对这些语义感兴趣。

我想这样做的原因是这样的。我有两个等级的层次结构,其中一个层次结构(父级)在同一层次结构级别上聚合来自另一个(子级)的对象。我使用自定义容器进行聚合。我想在父类中对容器进行 typedef(typedef 具有相同的名称),并在父类的每个级别声明具有相同名称的容器

类层次结构旨在在较低级别包含较少的信息(基类包含的信息最少),因此切片在这里非常有意义。

编辑:

你去吧,这应该把事情搞清楚了。

class A { int x; }; 
class B : public A {int y;};
class Ap {std::vector<A> entries;};
class Bp : Ap{std::vector<B> entries;};

子类 B 的成员比子类 A 多。但是,我不想为只对类 A 的成员感兴趣的代码提供统一的接口(interface)。

最佳答案

如果直接设置 b::x 就没办法了. a::xb::x是两个不同的成员,后者隐藏了前者。

您仍然可以访问 a::xb 类型的对象上与 static_cast<a&>(bee).x = 3 , 但根本问题是 a::x 的值和 b::xb 类型的对象上不同步。

如果您抽象访问这两个 x具有“属性 getter/setter”的成员,那么您可以安排派生类上的 setter 也更新基类的成员。或者(也许这更合适?)你可以让基类的成员 protected并直接从派生类中使用它,在从 getter 返回之前根据需要进行切片。

关于c++在子类和切片中重新定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5377840/

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