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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
#1

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

01.09.2013, 22:26. Просмотров 529. Ответов 10
Метки нет (Все метки)

Доброго времени суток !

Есть абстрактный класс A с одной чисто виртуальной функцией. Есть два наследуемых класса В и С, которым необходима эта функция. И есть класс D, но он должен быть не абстрактным, т.е. надо НЕ наследовать единственную функцию из базового класса. Везде используется открытое наследование.

Подскажите: как лучше реализовать ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 22:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос НЕнаследование чисто виртуальной функции (C++):

Исключение для чисто виртуальной функции - C++
Читал вопросы на собеседованиях по С++ и столкнулся с pure virtual function call исключение. Объясните пожалуйста зачем это нужно ?! В моем...

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

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

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

Вызов виртуальной функции - C++
Здравствуйте, есть код: #include <iostream> using namespace std; class A{ public: virtual void doIt() {cout << "1";} ...

Смысл виртуальной функции? - C++
Добрый день, вопрос состоит в следующем, какой вообще смысл иметь виртуальную функцию? ну точней, вот если можно какой нибудь маленький...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
01.09.2013, 22:32 #2
Цитата Сообщение от oodessit Посмотреть сообщение
И есть класс D, но он должен быть не абстрактным, т.е. надо НЕ наследовать единственную функцию из базового класса.
Класс можно назвать абстрактным лишь в том случае, если один или несколько его членов не определены - в данном случае это чисто виртуальный метод. Если в одном из наследующих классов данный метод определить, то такой класс уже не будет абстрактным.
0
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
01.09.2013, 22:37  [ТС] #3
этот метод, вообще, не будет использоваться в классе D. Поэтому мне необходимо совсем от него избавиться в классе-наследнике
0
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
01.09.2013, 23:32 #4
Не наследовать совсем не получится. Придется унаследовать и определить, чтобы класс-потомок перестал быть абстрактным и можно было бы создавать его экземпляры.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,589
Записей в блоге: 4
01.09.2013, 23:36 #5
Цитата Сообщение от oodessit Посмотреть сообщение
этот метод, вообще, не будет использоваться в классе D. Поэтому мне необходимо совсем от него избавиться в классе-наследнике
Боюсь ответа, но спрошу: как собираетесь это сделать? Помните совет проф. Преображенского Борменталю: -"На преступление не идите никогда, против кого бы оно ни было направлено!"
Если не определить чисто виртуальный метод, то он останется не определённым и класс будет абстрактным.
Можно необходимые данные и методы собрать в неабстрактном классе унаследовав от него абстрактный. От абстрактного B и С, а D унаследовать от того, что выше абстрактного:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
using namespace std;
 
class Adat
{
public:
int a,b,c;
Adat(int a_, int b_, int c_):a(a_), b(b_), c(c_){}
 
};
 
class Aabstr :public Adat
{
public:
virtual void showMyClass()=0;
Aabstr(int a_, int b_, int c_):Adat(a_, b_, c_){}
};
class B  :public Aabstr
{
protected:
void showMyClass(){cout<<"B"<<endl;}
public:
B(int a_, int b_, int c_):Aabstr(a_, b_, c_){}
};
class C  :public Aabstr
{
protected:
void showMyClass(){cout<<"C"<<endl;}
public:
C(int a_, int b_, int c_):Aabstr(a_, b_, c_){}
};
 
class D  :public Adat
{
public:
D(int a_, int b_, int c_):Adat(a_, b_, c_){}
void showMyClass(){cout << "D( "<< a << ", " << b << ", " << c << " )" << endl;}
};
 
int main()
{
Aabstr *b = &B(1,2,3);
b->showMyClass();
cout<<b->a<<endl;
b=&C(3,4,5);
b->showMyClass();
cout<<b->a<<endl;
D d(7,8,9);
d.showMyClass();
cin.get();
    return 0;
}
1
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.09.2013, 17:10 #6
Хорошее решение.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.09.2013, 17:22 #7
IGPIGP, Э. Вы чего делаете-то?
C++
1
Aabstr *b = &B(1,2,3);
После конца данной строки b указывает не пойми куда, т.к. по этому адресу уже нет объекта типа B.
1
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.09.2013, 17:44 #8
Да. Тут, конечно же, надо было как-то так:
C++
1
2
3
4
5
6
7
8
9
10
B b(1,2,3);
Aabstr *b_Aabstr = &b;
 
// Или так:
Aabstr *b = new B(1,2,3);
//...
delete b;
 
//Или так:
std::auto_ptr< Aabstr > b( new B( 1, 2, 3 ) );
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,589
Записей в блоге: 4
02.09.2013, 19:43 #9
ForEveR, это верно. Анонимный объект в стеке. До выхода из фрейма уже может быть убит. Не нужно этого делать, даже при использовании в следующей инструкции. Согласен.
Цитата Сообщение от BRcr Посмотреть сообщение
Хорошее решение.
Думаете? А так если?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
class Adat
{
public:
int a,b,c;
Adat(int a_, int b_, int c_):a(a_), b(b_), c(c_){}
 
};
 
class Aabstr 
{
public:
virtual void showMyClass()=0;
};
class B  :public Adat, public Aabstr
{
public:
void showMyClass(){cout<<"B"<<endl;}
public:
B(int a_, int b_, int c_):Adat(a_, b_, c_){}
};
 
class C  :public Adat, public Aabstr
{
public:
void showMyClass(){cout<<"C"<<endl;}
public:
C(int a_, int b_, int c_):Adat(a_, b_, c_){}
};
 
class D  :public Adat
{
public:
D(int a_, int b_, int c_):Adat(a_, b_, c_){}
void showMyClass(){cout << "D( "<< a << ", " << b << ", " << c << " )" << endl;}
};
 
int main()
{
B b(1,2,3);
b.showMyClass();
cout<<b.a<<endl;
Aabstr *ptr = &b;
ptr->showMyClass();
C c(3,4,5);
c.showMyClass();
cout<<c.a<<endl;
ptr = &c;
ptr->showMyClass();
D d(7,8,9);
d.showMyClass();
cin.get();
return 0;
}
0
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.09.2013, 19:54 #10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Думаете? А так если?
Тоже хорошее. Вижу разницу лишь в большей гибкости в применении модификаторов доступа при наследовании. В остальном разницы особой не вижу.

В том смысле, что потомки могут наследоваться и так, и сяк, по-разному:
C++
1
2
3
class C  :private Adat, public Aabstr //...
 
class C  :public Adat, protected Aabstr //...
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,589
Записей в блоге: 4
02.09.2013, 20:26 #11
Сохранение адреса в указателе на базовый класс
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
ptr = &c;
при protected наследовании в таком стиле не получается. Явно привести можно:
C++
1
ptr = (Aabstr*)&c;
Добавлено через 22 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Явно привести можно:
Нашёл у Павловской:
абстрактный класс нельзя использовать при явном приведении типов, для описания типа параметра и типа возвращаемого функцией значения.
Что касается функции, оно и понятно. Нельзя создавать объект, а в случае передачи и возврата из функции по значению объект создаётся.
А начало фразы не однозначно. Использование типа, для явного приведения к указателю на тип, это другой случай?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2013, 20:26
Привет! Вот еще темы с ответами:

Переопределение виртуальной функции - C++
Всем доброй ночи :) Есть базовый абстрактный класс и два производных класса (А и В), в которых я пытяюсь переопределить виртуальную...

Добавление виртуальной функции - C++
Добрый вечер, требуется показать работу виртуальной функции в данной задаче... Что и как можно тут поменять? #include &lt;conio.h&gt; ...

Вызов виртуальной функции по указателю - C++
Суть в том, что преподаватель дал задание на защиту курсовой: вызов по указателю виртуальной функции из ТВР, искал в интернете, наткнулся...

Класс с применением виртуальной функции - C++
Нужна программа создания класса и применения виртуальной функции... Тут есть пример... но я вообще вкурить не могу.... (я новичке)... ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2013, 20:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru