1 / 1 / 1
Регистрация: 01.07.2013
Сообщений: 127

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

23.08.2013, 18:45. Показов 5874. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru