Абстрактный родитель

Тема в разделе "Общие вопросы по С и С++", создана пользователем Misha111, 31 май 2008.

Статус темы:
Закрыта.
  1. Misha111

    Misha111 Гость

    Есть абстрактный класс (с абстрактными функциями) и его ребенок, где переопределены абстрактные функции родителя.
    В общем вроде все просто, но при коде:

    [codebox]class A
    {
    public:
    A(void)
    {
    Open();
    }
    ~A(void)
    {
    Close();
    }
    void Open(void)
    {
    internalOpen();
    }
    void Close(void)
    {
    internalClose();
    }
    protected:
    virtual void internalOpen(void) = 0;
    virtual void internalClose(void) = 0;
    };

    class B: public A
    {
    int x;

    protected:
    virtual void internalOpen(void)
    {
    x = 1;
    }
    virtual void internalClose(void)
    {
    x = 2;
    }
    };

    B b;[/codebox]

    ругается - вызов абстратной функции (internalOpen), но ведь он переопределен в В???
    НЕ ПОНИМАЮ!!! Подскажите почему не работает.
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    В конструкторе нельзя вызывать виртуальные методы. Когда создается объект базового класса, порожденный объект еще не инициализирован, так что VMT содержит только методы текущего типа.
     
  3. Misha111

    Misha111 Гость

    Спасибо.
    Как я понял тоже самое произойдет и в деструкторе.
    Довольно долго пришлось прг на Delphi. Сейчас перешел на C++.
    В Delphi такое проходит и очень удобно использовать.
    И на сколько я понял, в конструкторе и диструкторе родителя будут вызываться только его функции.
    Механизм virtual на проходит, а жаль.
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Зачем городить такой забор с конструктором/деструктором? Вы можете их спокойно переопределить и без защищенных абстрактных функций
     
  5. destr

    destr Гость

    Я вообще не понял смысла этого творения.
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Смысл этого творения - предоставление классам-наследникам интерфейса инициализации, который необходимо реализовать. Только вот конструкор сам может выполнять такую роль. Кроме того, возможно использование идиомы двухфазного конструктора (т.е. через отдельный метод Initialize)

    Вот, кстати, есть ссылка: http://ru.wikipedia.org/wiki/Конструктор_(программирование)
     
  7. destr

    destr Гость

    Точно! Что-то я сразу не уловил мысль.
     
Загрузка...
Похожие Темы - Абстрактный родитель
  1. Gor
    Ответов:
    24
    Просмотров:
    6.487
  2. Medevic
    Ответов:
    3
    Просмотров:
    2.730
Статус темы:
Закрыта.

Поделиться этой страницей