Немного неаккуратно, но вы могли бы потенциально использовать что-то похожее на следующее, чтобы сделать это:
template <attribute x> class Base
{
public:
attribute get_x ( ) { return x; }
};
class Derived1 : public Base<SOME_ATTRIBUTE_1>
{
...
};
class Derived2 : public Base<SOME_ATTRIBUTE_2>
{
...
};
Аналогично ответу Карла, но сохраняет унаследованное / производное отношение (ну, почти - см. @ Visitor'sкомментарий ниже).
С другой стороны, есть ли причина не делать простое переопределение?Например:
class Base
{
public:
virtual attribute get_x ( ) = 0;
};
class Derived1 : public Base
{
public:
attribute get_x ( ) { return SOME_ATTRIBUTE_1; };
};
class Derived2 : public Base
{
public:
attribute get_x ( ) { return SOME_ATTRIBUTE_2; };
};
РЕДАКТИРОВАТЬ: обратите внимание, что шаблонный подход может быть расширен на столько атрибутов, сколько требуется, как указано ниже:
template <attribute1 x, attribute2 y ...> class Base
{
public:
attribute get_x ( ) { return x; }
attribute get_y ( ) { return y; }
...
};
Другое решение, имеющееКаждый атрибут, являющийся свойством класса, может быть следующим:
class Base
{
public:
Base (attribute newX) : x(newX) { }
attribute get_x ( ) { return x; };
protected:
const attribute x;
};
class Derived1 : public Base
{
public:
Derived1 ( ) : Base(SOME_ATTRIBUTE_1) { }
};
class Derived2 : public Base
{
public:
Derived2 ( ) : Base(SOME_ATTRIBUTE_2) { }
};
Здесь каждый Derived
имеет свойство константы, уникальное для этого класса.Вы, конечно, можете отказаться от const
, если хотите.