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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корректное считывание данных 
:(
    Опции темы
LPBOY
Дата 8.8.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

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



Если нужно вызвать ЧИСТО ВИРТУАЛЬНУЮ ФУНКЦИЮ в БАЗОВОМ классе, то надо так:
Код

#include <iostream>

using namespace std;

class Base {
public:
  virtual void pure_virt() const = 0;
};

// Тело чисто виртуальной ф-ии
void Base::pure_virt() const {
  cout << "Base::pure_virt()" << endl;
}


class Derived : public Base {
public:
  void pure_virt() const {}
  void some_fn() const { Base::pure_virt(); }
};

int main() {
  Derived d;
  d.some_fn();
  system("pause");
} 

Если ПЕРЕОПРЕДЕЛЕННУЮ из ПРОИЗВОДНОГО класса, то так:
Код

#include <iostream>

using namespace std;

class Base {
public:
  virtual void pure_virt() const = 0;
};

class Derived : public Base {
public:
    void pure_virt() const {cout<<"Derived::pure_virt()"<<endl;}
};

int main() {
  Derived d, *pd=&d;
  Base* b=&d;
  d.pure_virt();
  pd->pure_virt();
  b->pure_virt();
  system("pause");
} 

2Дрон Указатели на чисто виртуальные функции (а не переопределенные), в VTBL не помещаются!!!

Это сообщение отредактировал(а) LPBOY - 8.8.2005, 15:58
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 8.8.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



ОФФТОП: Кстати я и не знал, что [pure virtual] и [abstract] это один и тот же термин.
Это чисто Сишный, что ли термин? Ведь в паскале прямо ключевое слово abstract есть.



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


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



LPBOY
Что-то я тебя не понимаю.

В первом примере, например, ты вообще непонятно что делаешь.

Цитата(LPBOY @ 8.8.2005, 15:10)
2Дрон Указатели на чисто виртуальные функции (а не переопределенные), в VTBL не помещаются!!!

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

О чём спор?

Добавлено @ 14:15
comcon1
Цитата
Это чисто Сишный, что ли термин? Ведь в паскале прямо ключевое слово abstract есть.

Вроде да. В Java и С# тоже используется термин abstract.

Это сообщение отредактировал(а) Дрон - 8.8.2005, 14:16


--------------------
Да. Именно так.
PM   Вверх
LPBOY
Дата 8.8.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

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



Цитата
А зачем кому-то в здравом уме вызывать чисто виртуальную функцию????
Вызывают всегда переопределённые, а чисто виртуальная функция это только интерфейс, который служит для обобщения правил доступа к производным классам.

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

Цитата
О чём спор?

Спор о том что ты в ответ на мой пост, в котором я сказал что чисто вирт. ф-ии вызывать можно
и что только статически, сказал, что это бред. Приведи аргументы, в таком случае...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Дрон
Дата 8.8.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



LPBOY
Создай лучше отдельную тему. И опиши свои "претензии" smile

И ещё, я не совсем понимаю твою терминологию.

Что значит вызывать чисто виртуальные функции?
Что, в этом контесте, значит вызывать статически?

Цитата(LPBOY @ 8.8.2005, 15:21)
Чисто виртуальные функции используются для определения поведения по умолчанию

Какого ещё поведения по умолчанию, если у них нет тела???



--------------------
Да. Именно так.
PM   Вверх
LPBOY
Дата 8.8.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

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



Цитата
Что значит вызывать чисто виртуальные функции?

Это значит вызывать функции корорые объявлены таким образом:
virtual void f()=0; а не те которые переопределены в производных классах.


Цитата
Что, в этом контесте, значит вызывать статически?

В этом контексте и не только в этом "статически" оэначает во время компиляции,
а обычные вирт. ф-ии связываются во время выполнения.


Цитата
Какого ещё поведения по умолчанию, если у них нет тела???

Опять 25. Тело может быть - смотри мой первый пример!!!

P.S. Ты че издеваешься надо мной? smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Дрон
Дата 8.8.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Цитата(LPBOY @ 8.8.2005, 15:35)
а обычные вирт. ф-ии связываются во время выполнения.

Чисто вирт. функции ничем не отличаются от "обычных" виртуальных. Они тоже связываются во время выполнения.

По-моему, разницу можно заметить только попытавшись вызвать чисто вирт. функции в конструкторе базового класса (там механизм виртуальности не сработает, т.к. объект ещё не инициализирован, и выведет "pure virtual function call").

Цитата(LPBOY @ 8.8.2005, 15:35)
P.S. Ты че издеваешься надо мной? smile

Пойдём другим путём smile

Скажи, будет ли работать этот пример:
Код

class Base
{
public:
    virtual void Method1() = 0;

    void Method2()
    {
        Method1(); // ну вот и вызываем :)
    }
};

class Derived: public Base
{
     void Method1()
     {
          cout << "Method1\n";
     }
};

void main()
{
    Base *p = new Derived;
    p->Method2();
}


Или я просто не понимаю о чём ты говоришь??


--------------------
Да. Именно так.
PM   Вверх
comcon1
Дата 8.8.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



ДАА!!!
Первый пример его работает!! Тока что скомпилил.
То есть абстрактные функции могут иметь тела, но вызываться тело будет только статически.
Круто!!!


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

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



Цитата
Скажи, будет ли работать этот пример:

Мне без разницы будет ли он работать. Ты вызови именно ЧИСТО виртуальную функцию динамически, а не переопределенную...
Добавлено @ 14:55
Спасибо большое comcon1, хоть кто-то поверил smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Дрон
Дата 8.8.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Цитата(comcon1 @ 8.8.2005, 15:49)
Первый пример его работает!! Тока что скомпилил.
То есть абстрактные функции могут иметь тела, но вызываться тело будет только статически.

Забавно. Это называется pure virtual function with a body. В нормальных условиях не используется smile
Добавлено @ 15:02
LPBOY
Цитата(LPBOY @ 8.8.2005, 15:52)
Ты вызови именно ЧИСТО виртуальную функцию динамически, а не переопределенную...

Не надо кричать. Надо просто уметь изъясняться так, чтобы и остальным было понятно smile
Разве не чувствуешь разницы: "чисто виртуальная функция" и "чисто виртуальная функция с телом".


--------------------
Да. Именно так.
PM   Вверх
LPBOY
Дата 8.8.2005, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

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



Ты меня сначала до нервного срыва довел, а теперь говоришь "не надо" кричать smile
(У меня две операционки в одной не работает инет, а в другой VC - благодаря тебе я последний час туда-сюда грузился как сумасшедший smile )

Цитата
Разве не чувствуешь разницы: "чисто виртуальная функция" и "чисто виртуальная функция с телом".

Кто бы говорил smile Я между прочим насчет "тела" много раз упоминал...
Ладно надеюсь этот спор закончен...

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 8.8.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



аминь


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


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



LPBOY
Признаю, что проглядел в твоём примере, что тело-то определено.

Это настолько редкая фишка (и ИМХО нафиг не нужная), что я долго врубится не мог smile smile

Как-то я невнимательно читаю... Видимо, фраза "для чисто виртуальных функций виртуальный механизм не работает" шокировала меня настолько, что остальное я и не заметил smile


--------------------
Да. Именно так.
PM   Вверх
CoreDumped
Дата 9.8.2005, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.8.2005

Репутация: нет
Всего: 1



Цитата(comcon1 @ 8.8.2005, 12:56)
...
Функция ведь абстрактной не объявлена.
...

абстрактным должен объявляться базовый клас а не функция. Класс, который имеет хотябы одну чистую виртуальную функцию является абстрактным и может использоваться только при наследовании.
PM MAIL   Вверх
comcon1
Дата 9.8.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Я просто не знал, что pure virtual и abstract - одно и то же. smile А код она дала позже, чем я написал этот пост.
Вообще все, вроде разрулилось, правда мы долго не могли воткнуть, что абстрактные функции могут иметь тело smile.


--------------------
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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