Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
23.08.2013, 18:45     Исключение для чисто виртуальной функции #1
Читал вопросы на собеседованиях по С++ и столкнулся с 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 генерировавшего некое исключение, ни объявления исключений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,695
Записей в блоге: 3
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". Ну и сами виртуальные функции могут позволить получить доступ к переменным наследника, если они так переопределены. Чтобы это было легче, пересмотрите доступ к членам структур и классов через указатель. Иначе никак точно не скажете, хотя интуитивно верно пытаетесь выразить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 19:27     Исключение для чисто виртуальной функции
Еще ссылки по теме:

C++ В чем разница между виртуальной и чисто виртуальной функцией?
C++ Нужно ли прописывать конструктор и деструктор для чисто виртуального абстрактного класса
C++ Возможно ли? Базовый класс с чисто виртуальной функцией и наследники

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

Или воспользуйтесь поиском по форуму:
ArkTaS
1 / 1 / 0
Регистрация: 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, 
        //используя синтаксис обращения к его собственной виртуальной функции
Yandex
Объявления
26.08.2013, 19:27     Исключение для чисто виртуальной функции
Ответ Создать тему
Опции темы

Текущее время: 03:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru