2014-11-06 3 views
0

У меня есть несколько общих вопросов о C++, о которых мне было интересно, может ли кто-нибудь ответить. Я пишу файл .cpp, который имеет реализации для файла заголовка, который предоставляет мой учитель. Нам не разрешено изменять файл. В принципе, заголовок имеет декларации для корабля базового класса и 4 конкретных типа кораблей. Мои вопросы: 1) Определение класса для корабля базового класса не содержит конструктора. Вместо этого он имеет защищенную функцию Set, которая устанавливает значения для частных членов данных. Предоставляет ли компилятор конструктор по умолчанию? (В основном это автоматически устанавливает частные переменные int равными 1)? Потому что я использую новую функцию динамической памяти для создания объектов производных классов Ship.Что касается наследования и полиморфизма в C++

2) У меня есть заголовок функции virtual int size (void) const = 0; внутри корабль базового класса. Я хочу использовать функцию size() внутри другой функции-члена, чтобы проверить, действительно ли размер судна. Я бы использовал this-> size(), чтобы сделать это внутри объявления функции-члена? (Я уже переопределял размер виртуальной функции в реализации каждого конкретного производного класса)

Thankyou очень много! Пожалуйста, дайте мне знать, если мне нужно включить код или быть более конкретным. Я ценю помощь.

+0

1) «Предоставляет ли компилятор конструктор по умолчанию?» Это зависит, но даже если бы элемент 'int' был инициализирован по умолчанию, т. Е. Мусор. 2) Хорошо, да, как бы вы это сделали? – user657267

+0

Вопрос в том, знает ли компилятор автоматически, какую функцию() выбрать? Потому что я переопределял функцию размера для каждого производного класса. –

+0

Ваш компилятор не будет (как правило, не обычно), виртуальная диспетчеризация - это функция времени исполнения.«Правильная» функция будет вызываться во время выполнения, если функция виртуальна, если в коде нет ошибок. – user657267

ответ

0

1) Предоставляет ли компилятор конструктор по умолчанию?

Обычно, да.

(В основном, он автоматически устанавливает частные переменные типа, равные 1)?

№ По умолчанию конструктор не устанавливает int членов - частный или иным образом - ни к чему. Они не инициализированы и не могут быть прочитаны до тех пор, пока они не будут назначены.

Потому что я использую функцию динамической памяти new для создания объектов производных классов корабля.

Это не относится к тому, где частный инициализируется инициализированным (т. Е. Он по-прежнему не работает).

2) У меня есть заголовок функции virtual int size(void) const = 0; внутри базового класса ship. Я хочу использовать функцию size() внутри другой функции-члена, чтобы проверить, действительно ли размер судна. Могу ли я использовать this->size() для этого в объявлении функции члена? (I перекрытая размер виртуальной функции в реализации каждого конкретного производного класса уже)

Как новичок, разумное правило заключается в том, чтобы попытаться вызвать функцию как можно проще: size(). Только если это не сработает, попробуйте this->size(). Причины, по которым это может не сработать, усложняются, но руководство остается простым.

+0

Функция size() возвращает разные значения для разных классов. Вы знаете, как я бы назвал size() для правильного производного класса? Я просто пишу size(), и компилятор выберет? –

+0

@KevinCheng Вы сказали, что это «виртуальный» - это означает, что если у вас есть «Base &» или «Base *» для любого объекта в иерархии типов, вы можете вызвать 'size()' и он будет вызывать реализацию реального динамического типа , Попробуйте, и если у вас есть проблемы, отправьте свой код с объяснением того, что вы ожидали, тем, что вы наблюдаете, и тем, что вы не понимаете, из-за этого. –

+0

Я получил его. Благодаря!!! Он работал с этим -> size(). Вопрос: мне нужно включить этот указатель()? Также этот указатель является указателем на базовый класс? –

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