#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; };
Почему меня интересует эта семантика.
Причина, по которой я хочу это сделать, заключается в следующем. У меня есть две иерархии классов, где одна иерархия (родитель) объединяет объекты на том же уровне иерархии с другой (дочерней). Я использую пользовательский контейнер для агрегации. Я хочу напечатать контейнер в родительском классе (typedefs имеют одинаковое имя) и объявить контейнер с одинаковым именем на каждом уровне родительского класса.
Классовые иерархии предназначены для того, чтобы содержать меньше информации на более низких уровнях (базовые классы содержат меньше всего), поэтому срез здесь имеет смысл.
Edit:
Ну вот, это должно прояснить ситуацию.
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.