Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование, не могу сообразить. / 8 сообщений из 8, страница 1 из 1
11.11.2013, 19:01
    #38460953
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class A
{
  public:
    A () 
    { 
      I(); 
    };
    virtual ~A() {};

  private:
    virtual void I() = 0;
}

class B: public A
{
 public:
 B() {};
 ~B() {};
 private:
  void I() {  cout << "B::I()"};
}


int main()
{

  B *b = new B(); // ожидалось B::I(), но чуда не случилось
}


Как ?
...
Рейтинг: 0 / 0
11.11.2013, 19:25
    #38460979
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
Ken@t,

B *b = new B(); // ожидалось B::I(), но чуда не случилось

Как раз тут и случилось чудо -- С++ отработал в соответствии со здравым смыслом и своей спецификацией.
Вызвалась та виртуальная функция, типом класса которой является в данный момент объект.

Объясни же, что тебе надо ?
Если просто вызывать B::I(), то это надо делать не ранее, чем в конструкторе класса B (или после), потому как до этого момента объект не является объектом класса B.
...
Рейтинг: 0 / 0
11.11.2013, 20:12
    #38461030
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
MasterZiv,

Вспоминаю, А пральный ответ в конструкторах и деструкторах не вызывать виртуальные методы.

Идея была в базовом конструкторе вызывать метод перопределенный в наследуемых классах, не важно теперь.
...
Рейтинг: 0 / 0
12.11.2013, 09:29
    #38461368
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
Вспоминаю, А пральный ответ в конструкторах и деструкторах не вызывать виртуальные методы.


Да нет, вызывай, сколько влезет.

Идея была в базовом конструкторе вызывать метод перопределенный в наследуемых классах, не важно


Это глупая идея, даже в Java, где вызывается реализация виртуальной функции номинального класса. Такие глупости выходят... Например, перезагрузил функцию, предопределил инициализацию, а потом вызвалась инициализация предка, операторов твою инициализацию на фиг. Хорошо, если целиком, а если наполовину?


А такое, как ты хочешь, делается просто — ничего не делающий конструктор и виртуальная функция инициализации, вызываемая после конструирования.
...
Рейтинг: 0 / 0
12.11.2013, 23:27
    #38462820
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
MasterZiv,

ну вот, а человеку так хотелось написать виртуальный конструктор :).
...
Рейтинг: 0 / 0
12.11.2013, 23:34
    #38462826
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
Mozok,

Так эта, чё, пусть пишет виртуальный конструктор , я не против.
...
Рейтинг: 0 / 0
14.11.2013, 22:24
    #38465741
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
MasterZiv,

подразумевался не паттерн, а самый настоящий виртуальный конструктор .
...
Рейтинг: 0 / 0
14.11.2013, 22:38
    #38465753
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, не могу сообразить.
это мы ещё не дошли до выброса исключения из конструктора
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование, не могу сообразить. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]