Инициализация члена C ++ VS наследуемая инициализация конструктора - PullRequest
0 голосов
/ 05 февраля 2019

Я знаю, что один из способов инициировать членов класса - написать следующее:

class base {
 int id;
 public:
 base(int id): id(id){}
};

Но что, если я смешаю этот синтаксис с constructor initialization of a derived class:

class base {
 int id;
 public:
 base(int id): id(id){}
};

class dri : public base {
 int base;
 public:
 dri(int id): base(id){}
};

В приведенном выше примере для класса derived относится ли base(id){} к int base или class base?Я предполагаю, что это относится к int base, так как «не компилируется».Как я могу сделать это, ссылаясь на class base?

Редактировать:

Второй вопрос, допустим, вы смотрите на случайный код C ++, который выглядит так:

class base {
 int id;
 public:
 base(int id): id(id){}
};

Как вы можете узнать, id(id){} инициализирует локальную переменную или инициализирует конструктор другого класса?

1 Ответ

0 голосов
/ 05 февраля 2019

Не используйте повторно идентификатор base - самый простой совет.

Более сложным было бы использование разрешения области действия:

dri(int id): ::base(id){}
              ^
              use base from the global namespace

Ответ на редактирование после вопроса:

Последнее определенное использование идентификатора будет использоваться над определениями во внешних областяхесли внешняя область явно не указана.Нет хорошего способа узнать, что вы получите, не действуя как компилятор и не построив график того, какие идентификаторы определены и где, и выполняя разрешение самостоятельно.

То, с чем вы столкнулись, точно такое же, как

int string; 
string test; 

к тому времени, когда компилятор достигает string test, значение string было изменено программистом стип переменной типа int.Для этого нет другого решения, кроме как не делать этого.

Это возвращает нас к исходной точке: не используйте идентификаторы в объединенных областях без уважительной причины.Кто-то облажается.

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