Есть ли что-нибудь опасное или необычное в этом?
Если у Y есть свои собственные члены данных (не в базовом классе), они не будут инициализированы.
class Y : public X {
public:
Y() {}
Y(const X& a) : X(a)
{
//'n' hasn't been initialized!
}
int n;
};
Если у Y нет собственных элементов данных, почему это отдельный подкласс? Это так, что он может переопределить виртуальные члены X?
Возможно, что если предполагается, что X подклассов подобен этому, то это должен быть абстрактный класс с чисто виртуальными методами, который невозможно создать сам по себе.
Вместо того, что вы предлагаете, рассмотрите возможность сдерживания вместо подклассов (у Y "X вместо Y" есть "X):
class IAnInterface
{
public:
virtual ~IAnInterface();
virtual void SomeMethod() = 0;
virtual void AnotherMethod() = 0;
}
class Y : public IAnInterface {
public:
Y(const X& x) : m_x(x)
{
}
X m_x;
virtual void SomeMethod() { ... an implementation ... }
virtual void AnotherMethod() { ... another implementation ... }
};