Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественное наследование, виртуальные классы, вопрос из книги 
V
    Опции темы
zim22
Дата 11.4.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Читаю книгу, в конце главы вопрос:
"Существует один случай, когда производный класс не должен предоставлять инициализирующих значений для своих виртуальных базовых классов. Что это за случай?"
на англ.: "There is one case in which a derived class need not supply initializers for its virtual base class(es). What is this case?"

Я думаю правильный ответ "Это случай с абстрактным базовым классом"
Но мало ли. Мне интересно узнать правду smile



--------------------
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  11.4.2009,  10:03 Найти цитируемый пост)
Я думаю правильный ответ "Это случай с абстрактным базовым классом"

Я использую абстрактные базовые классы и передаю им значения для инициализации.

Думаю правильный ответ "Если они не требуются" - если в базовом классе нет никаких инициализирующих значений - есть только методы.
PM MAIL ICQ   Вверх
zim22
Дата 11.4.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Anikmar @  11.4.2009,  10:18 Найти цитируемый пост)
 если в базовом классе нет никаких инициализирующих значений

всмысле этот тот случай, когда используется конструктор по умолчанию?


--------------------
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  11.4.2009,  10:20 Найти цитируемый пост)
всмысле этот тот случай, когда используется конструктор по умолчанию? 

Само собой, если у базового класса нет конструктора - то и передавать ему ничего нельзя - он же явно не вызывается.

В смысле когда у конструктора базового класса нет параметров - ему нечего передавать. Вызывается базовый конструктор без параметров.

Если, конечно, я правильно вопрос понял:
Цитата(zim22 @  11.4.2009,  10:03 Найти цитируемый пост)
когда производный класс не должен предоставлять инициализирующих значений


Не должен - если их нет.
Если они нужны - должен.

Положено мясо - ешь, не положено не ешь... smile 
PM MAIL ICQ   Вверх
Fazil6
Дата 11.4.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Anikmar @  11.4.2009,  10:36 Найти цитируемый пост)
В смысле когда у конструктора базового класса нет параметров - ему нечего передавать. Вызывается базовый конструктор без параметров.

не думаю, что речь идет о этом.не зря ведь в вопросе сказано

Цитата(zim22 @  11.4.2009,  10:03 Найти цитируемый пост)
"Существует один случай, когда производный класс не должен предоставлять инициализирующих значений для своих виртуальных базовых классов. Что это за случай?"


Вообще с виртуальными базовыми классами ситуация сложнее чем с обычным наследованием. Не знаю в каком контексте и какой именно случай имел в виду автор но, при использовании виртуального базового класса и необходимости вызова его конструктора с параметрами, этот инициализирующий конструктор должен вызываться самым последним классом в иерархии.  Т.е. что-то типа того
Код

#include <iostream>

// -------------------------------------
class B1
{
public:
    B1(int _x) : x(_x) {}
    B1(){}

    int x ;
};
// -------------------------------------
// -------------------------------------
class D11 : virtual public B1
{
public:
    D11() {}
};
// -------------------------------------
class D12 : virtual public B1
{
public:
    D12() {} // тут вроде как не должен указываться конструктор, хотя и может
             // все равно используется тот, который в конструкторе D2
};
// -------------------------------------
// -------------------------------------
// -------------------------------------
class D2 : public D11 , public D12 
{
public :
    D2(int _x) : B1(_x) {}
};
// -------------------------------------

void main()
{
    D2 d2(11);

    std::cout << d2.x;
}


вобщем как вариант ответа если этот класс имеет наследника(ов)


PM MAIL   Вверх
zim22
Дата 11.4.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Fazil6 @  11.4.2009,  16:58 Найти цитируемый пост)
 этот инициализирующий конструктор должен вызываться самым последним классом в иерархии. 

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

Это сообщение отредактировал(а) zim22 - 11.4.2009, 17:09


--------------------
PM MAIL   Вверх
Fazil6
Дата 11.4.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



поэтому существует такая рекомендация: неиметь данных в базовых виртуальных классах, т.е. использовать их как интерфейсы
А еще одна рекомендация, которая как правило идет под номером 1, избегать ситуаций когда нужно использовать виртуальное наследование   smile 
Но это уже какждый решает для себя сам.

Добавлено через 45 секунд
Цитата(zim22 @  11.4.2009,  17:07 Найти цитируемый пост)
он может вызываться и всеми предпоследними классами в иерархии. только компилятор будет игнорировать все вызовы, за исключением последнего класса в иерархии вирт.наследования

может, но не обязан

Добавлено через 12 минут и 48 секунд
Цитата(zim22 @  11.4.2009,  17:07 Найти цитируемый пост)
инициализировать базовый виртуальный класс можно не только в наследуемом от него классе, но и в любом другом. Только в этом случае компилятор будет игнорировать инициализацию конструктора базового вирт.класса в списке инициализации.

я не знаю откуда ты вырываешь эти цитаты, или ты сам формулируешь, но эта мысль также не совсем точна. Дело в том, что инициализировать базовый виртуальный класс (как у тебя сказано) действительно можно не только в наследуемом от него классе, но и в любом другом, но если это последний класс в иерархии, то инициализировать базовый виртуальный класс он обязан, т.е. там он должен быть полюбому, а если это не последний , то вовсе необязательно
PM MAIL   Вверх
zim22
Дата 11.4.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Fazil6 @  11.4.2009,  17:07 Найти цитируемый пост)
я не знаю откуда ты вырываешь эти цитаты, или ты сам формулируешь,

Читаю книжку, а потом как понимаю, так и формулирую. Согласен, что неразбериху говорю. 


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0769 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.