2011-01-27 3 views
3

Я преобразовываю некоторые из своих математических классов в шаблоны и использую списки инициализации и сталкиваюсь с проблемой, когда унаследованный класс нуждается в доступе к элементам данных базового класса при инициализации.C++ Унаследованные классы шаблонов и списки инициализации

Вот код:

template <typename T> 
struct xCoord2 
{ 
    T x; 
    T y; 

    xCoord2(T _x, T _y) : x(_x), y(_y) {}; 
}; 

template <typename T> 
struct xCoord3 : xCoord2<T> 
{ 
    typedef xCoord2<T> B; 

    T z; 

    // All Error 
    xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {}; 

    // Works 
    xCoord3(T _x, T _y, T _z) { B::x = 0; B::y = 0; z = 0; }; 
}; 

Можно ли использовать списки инициализации на унаследованных классов?

+1

Является ли 'xCoord3' действительно' xCoord2'? Или они просто разделяют определенные данные? Это случай, когда наследование не может быть хорошей идеей, если нет отношения is-a между этими двумя классами. –

+0

Пример - это только часть каждого класса, но наследование здесь очень полезно, так как оно допускает математику между двумя типами. –

ответ

7

Вам нужно вызвать конструктор базового класса:

xCoord3(T _x, T _y, T _z) : xCoord2(_x, _y), z(_z) { } 

Это не было бы иначе, если бы они были нешаблонная классы: вы можете только инициализировать базовые классы и переменные-члены производного класса в производном классе конструктор ,

Смежные вопросы