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

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

Восстановить пароль Регистрация
 
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
01.09.2013, 22:26     НЕнаследование чисто виртуальной функции #1
Доброго времени суток !

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

Подскажите: как лучше реализовать ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
01.09.2013, 22:32     НЕнаследование чисто виртуальной функции #2
Цитата Сообщение от oodessit Посмотреть сообщение
И есть класс D, но он должен быть не абстрактным, т.е. надо НЕ наследовать единственную функцию из базового класса.
Класс можно назвать абстрактным лишь в том случае, если один или несколько его членов не определены - в данном случае это чисто виртуальный метод. Если в одном из наследующих классов данный метод определить, то такой класс уже не будет абстрактным.
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
01.09.2013, 22:37  [ТС]     НЕнаследование чисто виртуальной функции #3
этот метод, вообще, не будет использоваться в классе D. Поэтому мне необходимо совсем от него избавиться в классе-наследнике
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
01.09.2013, 23:32     НЕнаследование чисто виртуальной функции #4
Не наследовать совсем не получится. Придется унаследовать и определить, чтобы класс-потомок перестал быть абстрактным и можно было бы создавать его экземпляры.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,720
Записей в блоге: 3
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;
}
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.09.2013, 17:10     НЕнаследование чисто виртуальной функции #6
Хорошее решение.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.09.2013, 17:22     НЕнаследование чисто виртуальной функции #7
IGPIGP, Э. Вы чего делаете-то?
C++
1
Aabstr *b = &B(1,2,3);
После конца данной строки b указывает не пойми куда, т.к. по этому адресу уже нет объекта типа B.
BRcr
 Аватар для BRcr
4003 / 2292 / 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 ) );
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,720
Записей в блоге: 3
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;
}
BRcr
 Аватар для BRcr
4003 / 2292 / 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 //...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2013, 20:26     НЕнаследование чисто виртуальной функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,720
Записей в блоге: 3
02.09.2013, 20:26     НЕнаследование чисто виртуальной функции #11
Сохранение адреса в указателе на базовый класс
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
ptr = &c;
при protected наследовании в таком стиле не получается. Явно привести можно:
C++
1
ptr = (Aabstr*)&c;
Добавлено через 22 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Явно привести можно:
Нашёл у Павловской:
абстрактный класс нельзя использовать при явном приведении типов, для описания типа параметра и типа возвращаемого функцией значения.
Что касается функции, оно и понятно. Нельзя создавать объект, а в случае передачи и возврата из функции по значению объект создаётся.
А начало фразы не однозначно. Использование типа, для явного приведения к указателю на тип, это другой случай?
Yandex
Объявления
02.09.2013, 20:26     НЕнаследование чисто виртуальной функции
Ответ Создать тему
Опции темы

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