Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127

Исключение для чисто виртуальной функции

23.08.2013, 18:45. Показов 5849. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читал вопросы на собеседованиях по С++ и столкнулся с pure virtual function call исключение. Объясните пожалуйста зачем это нужно ?! В моем понимании чист. вирт. функц. созданая для того что бы никто не создавал объекты этого класса.
Ссылка на источник http://habrahabr.ru/post/117996/ и копия ответа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
10. Как сгенерировать pure virtual function call исключение?
 
Ответ: Нужно вызвать чисто виртуальный метод в конструкторе родительского класса т.е. до создания дочернего, в котором этот метод реализован. Т.к. современный компилятор не даст это сделать напрямую, то нужно будет использовать промежуточный метод.
Пример:
class Base
{
public:
    Base()
    {
        base_func();
    }
    void base_func()
    {
        func(); // pure virtual function call exception
    }
    virtual void func() = 0;
};
class Derived : public Base
{
public:
    virtual void func()
    {
    }
};
Здесь нет ни throw генерировавшего некое исключение, ни объявления исключений
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2013, 18:45
Ответы с готовыми решениями:

НЕнаследование чисто виртуальной функции
Доброго времени суток ! Есть абстрактный класс A с одной чисто виртуальной функцией. Есть два наследуемых класса В и С, которым...

В чем разница между виртуальной и чисто виртуальной функцией?
в чем разница между виртуальной и чисто виртуальной функцией? virtual void print(){..} virtual void ex(..)=0;

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

21
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.08.2013, 02:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ArkTaS Посмотреть сообщение
. Если бы была возможность выполнить команду ptrB->derv::func() компилятор выдал бы класс base не содержит члена derv::func().
ptB-> это обращение к члену класса base, так как ptB обявлен как base *, - указатель на объект типа base. В base нет имени derv. Это в принципе не относится к наследованию и полиморфизму при наследовании.
derv это отдельный класс. Хоть и наследник. Область его видимости не входит в базовый класс. Другими словами, базовый класс о нём ничего не знает. То что к его виртуальному методу можно обратиться через указатель на base, используя синтаксис обращения к его собственной виртуальной функции, это свойство языка. Ни к каким невиртуальным функциям и полям которых у base нет, так обратиться нельзя. Даже если base, наделе содержит адрес объекта производного класса, то указатель этого не видит. Иначе говоря, если его привести к типу derv, то тогда уже вычесленное выражение (derv*)ptrB будет интерпретироваться "указатель на derv", то есть "тот который видит члены derv". Ну и сами виртуальные функции могут позволить получить доступ к переменным наследника, если они так переопределены. Чтобы это было легче, пересмотрите доступ к членам структур и классов через указатель. Иначе никак точно не скажете, хотя интуитивно верно пытаетесь выразить.
1
1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127
26.08.2013, 19:27  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Чтобы это было легче, пересмотрите доступ к членам структур и классов через указатель. Иначе никак точно не скажете, хотя интуитивно верно пытаетесь выразить.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если бы была возможность выполнить команду ptrB->derv::func() компилятор выдал бы класс base не содержит члена derv::func().
Вы это имели ввиду ?
C++
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
29
30
31
#include <iostream>
#include <typeinfo> // для dynamic_cast
using namespace std;
 
class Base
{
public:
    virtual void show() { cout<<endl<<" Base show "; }
 
};
 
class Derv: public Base
{
public:
    virtual void show(){ cout<<endl<<" Derv show ";  }
};
 
int main()
{
    setlocale( LC_ALL,"Russian" );
    
    Base *ptr_base=new Derv();
 
    void (Derv::*ptr_Derv_show) ()=&Derv::show;
    ((*ptr_base).*ptr_Derv_show)();    // Ошибка преобразования и невозможно передать ссылку .... 
 
 
    cout<<endl;
    system("pause");
    return 0;
}
Добавлено через 6 минут
IGPIGP,
C++
1
2
3
4
    void (Base::*ptr_Base_show) ()=&Base::show;
    ((*ptr_base).*ptr_Base_show)();   // Обращение к таблице виртуальных функций 
        //для выбора подходящего метода через указатель на base, 
        //используя синтаксис обращения к его собственной виртуальной функции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2013, 19:27

Указатель для вызова виртуальной функции
Помогите разобраться в строении вызова виртуальной функции Если не сложно, объсните каждый указатель #include &lt;iostream&gt; ...

Функции для работы с виртуальной памятью
Здравствуйте, помогите пожалуйста решить задачу: С помощью функций VirtualAlloc, VirtualQuery и VirtualFree вычислить значение функции ...

Как сделать исключение для функции window.onbeforeunload = function() для конкретной кнопки?
У меня есть страница с формой я подключил вот этот код событию onclick кнопки&quot;сохранить&quot; function cantback(){ ...

Чисто вирутальные функции в шаблонном классе
Хотелось бы узнать, поддерживает ли это свойство Visual C++ 2010.

Вызвано исключение: нарушение доступа для чтения. Функции и двумерные массивы
Здравствуйте. В процессе выполнения несложного учебного задания столкнулся с ошибкой. Подозреваю, что ошибка очень глупая и вызвана...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru