Как я могу инициализировать константную переменную базового класса в конструкторе производного класса в C ++? - PullRequest
17 голосов
/ 11 октября 2010

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

Ответы [ 3 ]

22 голосов
/ 11 октября 2010

Законно ли это в C ++?

Нет.Константа должна быть инициализирована в конструкторе базового класса.

Решение состоит в том, чтобы предоставить соответствующий конструктор в базовом классе - иначе его нельзя использовать.Кроме того, нет причин не предоставлять этот конструктор.

class Base {
    int const constant;
public:
    virtual ~Base() = 0; // Makes this an abstract base class.
protected:
    Base(int c) : constant(c) { }
};

// Must be implemented!
Base::~Base() { }

class Derived : public Base {
public:
    Derived() : Base(42) { }
};
1 голос
/ 11 октября 2010

Если вам вообще нужно сделать это так:

struct Base {
    Base( std::string const & someValue )
    : const_value( someValue ) {
    }
protected:
   std::string const const_value;
};

struct Derived : Base {
    Derived()
    : Base("Derived"){
    }
};

Причина этого в том, что вам разрешено присваивать значения константному значению только во время инициализации. После инициализации Base вам больше не разрешено изменять значение. Поэтому вы должны сделать это так, как показано выше.

0 голосов
/ 11 октября 2010

Почему бы вам не создать защищенный конструктор в абстрактном базовом классе и не установить там значение константы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...