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

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

23.08.2013, 18:45. Показов 4028. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2013, 18:45
Ответы с готовыми решениями:

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

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

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

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

21
Комп_Оратор)
Эксперт по математике/физике
8726 / 4473 / 600
Регистрация: 04.12.2011
Сообщений: 13,361
Записей в блоге: 16
26.08.2013, 02:22 21
Цитата Сообщение от 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  [ТС] 22
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2013, 19:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru