#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 的成员感兴趣的代码提供统一的接口。