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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Крис Касперски по поводу С++ 
:(
    Опции темы
archimed7592
Дата 26.10.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  26.10.2007,  17:52 Найти цитируемый пост)
Все наследники TComponent по дефолту имеют виртуальный конструктор Create, а это вся палитра VCL, остальные его перекрывают.

Ок, сменим приоритеты: что такое виртуальный конструктор? В чём заключается его виртуальность(помимо, возможно, ключевого слова virtual)?

Добавлено через 37 секунд
Другими словами приведи пример, где будет видно, что конструктор виртуален.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 26.10.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Lazin @  26.10.2007,  15:41 Найти цитируемый пост)

Цитата(Alek86 @  26.10.2007,  15:39 )
чисто виртуальный конструктор

Виртуальных конструкторов не бывает в принципе


сори, оговорился. Деструктор



--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 26.10.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Alek86, студия позволяет делать чисто виртуальные деструкторы(точно так же, как и любой другой компилятор, утверждающий, что он соответствует Стандарту). Скорее всего их не умеешь делать ты smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 26.10.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



отакие сразу наезды...

отэто по стандарту должно скомпилиться и слинковаться?
Код


class IC {
public:
    virtual ~IC() = 0;
};

class C1 : public IC {
public:
    virtual ~C1() {}
};

int main() {
    IC* pC = new C1();
}



Это сообщение отредактировал(а) Alek86 - 26.10.2007, 19:42


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 26.10.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
отэто по стандарту должно скомпилиться и слинковаться?

Нет - ты же своим объявлением виртуального деструктора класс IC "отменил" его неявное определение(definition), а сам его определить не потрудился. А чтобы уничтожить объект деструкторы всех базовых классов должны быть доступны(не private) и определены(потому что деструктор твоего класса неявно вызывает деструкторы базовых классов).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 26.10.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
отэто по стандарту должно скомпилиться и слинковаться?

нет.


Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
virtual ~IC() = 0;

чисто виртуальный деструктор? быть не должно, исправляйте:
Код

virtual ~IC() {};



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 26.10.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(JackYF @  26.10.2007,  19:59 Найти цитируемый пост)
чисто виртуальный деструктор? быть не должно, исправляйте:

Интересно, почему? 0_о

Добавлено @ 20:07
То ли я чё-т недопонимаю, то ли... вы надо мной издеваетесь? smile
Вам религия не позволяет написать определение деструктора?
Это примерно то же самое что говорить "а почему вот это не линкуется?"
Код

stuct B
{
    virtual void foo() = 0;
};
stuct D
    : public B
{
    void foo()
    {
        B::foo();
        // ...
    }
};


Либо напишите определение B::foo, либо не делайте явный вызов B::foo()(либо не задавайте вопросов почему это не линкуется smile). Разница с деструктором только в том, что вы не можете не делать явный вызов IC::~IC() ибо за вас это сделает компилятор вам по любой придётся написать определение деструктора(если компилятор не делает это за вас).

Это сообщение отредактировал(а) archimed7592 - 26.10.2007, 20:10


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 26.10.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  26.10.2007,  20:03 Найти цитируемый пост)
Интересно, почему?

а что будет вызывать компилятор?

foo ему вызывать не требуется, а вот деструктор - извольте.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 26.10.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(JackYF @  26.10.2007,  20:22 Найти цитируемый пост)
а что будет вызывать компилятор?

IC::~IC(). А какие ты видишь в этом преграды? 0_о
Он и так его вызывает, только линкер определения ф-ции не находит.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 26.10.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(archimed7592 @  26.10.2007,  17:56 Найти цитируемый пост)
Ок, сменим приоритеты: что такое виртуальный конструктор? В чём заключается его виртуальность(помимо, возможно, ключевого слова virtual)?

Добавлено через 37 секунд
Другими словами приведи пример, где будет видно, что конструктор виртуален.


Например такой гипотетический пример загрузки вида.

Код

Function GetComponentClass : TCompomponentClass;
Begin
  Result := TButton;
end;

......

procedure ShowChild(InitProc : Function : TCompomponentClass; astream : TStream);
var
  AChild            : TComponent;
Begin
  AChild            := InitProc.Create(Panel1);
  AChild.LoadSizesFromStream(astream);
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 26.10.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  26.10.2007,  21:01 Найти цитируемый пост)
TCompomponentClass;

Ну, вот видишь - виртуальность конструктора проявляется только в случае создания через метакласс(как я и сказал ранее).
В С++ это реализуется очень просто - одна проблема: это нужно именно реализовывать. К примеру это реализованно утилитой moc в случае Qt. Это же реализованно частью компилятора bcc32(нет, нет, dcc32 тут не при чём - он же не понимает С++ код).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 26.10.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(archimed7592 @  26.10.2007,  21:07 Найти цитируемый пост)
Это же реализованно частью компилятора bcc32(нет, нет, dcc32 тут не при чём - он же не понимает С++ код). 

  И не нужно, VCL классы C++ Builder являются лишь интерфейсами делфийских классов, для которых есть метаклассы. Потому билдер просто использует этот отработанный механизм, не внося туда ничего от самого языка С++. А компилятор dcc32 поставляется с билдером и нужен для компиляции кода на Delphi (Object Pascal), который реально и реализует механизмы VCL.

Добавлено через 2 минуты и 6 секунд
Цитата(archimed7592 @  26.10.2007,  21:07 Найти цитируемый пост)
Ну, вот видишь - виртуальность конструктора проявляется только в случае создания через метакласс(как я и сказал ранее).

  А я разве говорил что это не так? Я говорил лишь, что это интенсивно используется в VCL и все, опровергая доводы о том, что это мало где используется.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 26.10.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  26.10.2007,  21:15 Найти цитируемый пост)
И не нужно, VCL классы C++ Builder являются лишь интерфейсами делфийских классов, для которых есть метаклассы.

Мы друг друга не понимаем...
В С++ рефлексии нет.
Пользовательский компонент можно использовать как и любой другой VCL'овский(в т.ч. виртуальные конструкторы и рефлексию в общем).
Вывод: bcc32 добавляет к С++ рефлексию(в том или ином виде) и dcc32 тут не при делах smile.


Цитата(Alexeis @  26.10.2007,  21:15 Найти цитируемый пост)
Я говорил лишь, что это интенсивно используется в VCL и все, опровергая доводы о том, что это мало где используется. 

А разве кто-то говорил, что это мало где используется? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 26.10.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Lazin @ 26.10.2007,  15:51)
Цитата(Alexeis @  26.10.2007,  15:42 Найти цитируемый пост)
Очень даже есть, на них весь VCL держится. Просто их нет в С++

Что-то я не замечал в вцл такого, на этапе создания объекта всегда известен его тип.
Код

TWinControl* btn = new TButton(Form);

Пояснение было больше к этому.

Цитата(archimed7592)

Пользовательский компонент можно использовать как и любой другой VCL'овский(в т.ч. виртуальные конструкторы и рефлексию в общем).


  Пользовательский компонент не может не быть наследником TComponent. 
class PASCALIMPLEMENTATION TButton : public TButtonControl 
  Мне кажеться что для классов наследников в билдере тоже создаются метаклассы иначе это потребовало слишком значительной переделкой самого VCL.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 26.10.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  26.10.2007,  21:51 Найти цитируемый пост)
Пользовательский компонент не может не быть наследником TComponent. 

Почему? Хочешь сказать в Builder'е невозможно создавать пользовательские контролы? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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