Скажите, что я хочу определить переменную-член в родительском классе и установить ее значение в унаследованном классе. Возможно, они идентифицируют функциональность, доступную в классе или характер дочернего класса. Например:Переопределить постоянную переменную-член в унаследованном классе
class A
{
public:
inline int getX() { return x; }
protected:
const int x = 0;
};
class B : public A
{
protected:
const int x = 10;
};
class C : public A
{
protected:
const int x = 50;
};
Должно быть понятно, что проблемы с охватом будут препятствовать правильной работе вышеприведенного. Однако есть ли способ сделать эту работу по-своему?
Поскольку переменная предназначена для определения характера унаследованных классов, я бы предпочел, чтобы она была const - эта проблема не возникла бы, если бы она не была const и просто переопределялась в конструкторе, насколько я могу судить.
С ** переменной предназначена для выявления характера унаследованных классов **, это делает намного больше смысла использовать полиморфизм. Это основная причина, по которой она была «изобретена». Другими словами, объявляйте 'virtual int getX()' и реализуйте эту функцию в каждом классе или просто используйте RTTI ('dynamic_cast') для каждого объекта, чтобы« обнаружить его природу ». –
@barakmanos. Часть цели заключалась в том, чтобы сделать каждую попытку, чтобы функция была встроена, так как это будет вызвано много. Этот способ является стандартным, но учитывая, как часто это будет использоваться в том, что я делаю, даже небольшое сокращение накладных расходов стоит того. Поскольку виртуальные члены обычно не будут встроены, я хотел сохранить реализацию в базовом классе. Основываясь на проверке сборки (на которую я не претендую на то, чтобы быть экспертом), кажется, по крайней мере, для моего простого тестового примера, эта функция будет встроена таким образом. –
@WilliamKappler важно, чтобы B & C получил от A, или вы хотите, чтобы у них был подобный интерфейс? Если последнее, есть «более быстрый» способ сделать это, что я могу вам показать. –