Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
RAFA91
Заблокирован
1

Неопределенность в абстракции

02.07.2016, 12:03. Просмотров 517. Ответов 22
Метки нет (Все метки)

Добрый день.

Есть класс A от которого производится класс В и С.

У этих классов есть общий метод f1().

у класса B не должно быть метода f3(), а у С метода f2()

что-бы работал полиморфизм мне пришлось определить методы f2() и f3() в классе А.

чистыми их делать не могу, так как у класса B не должно быть метода f3(), а у С метода f2().

чистый тут только f1()

вся опасность в этом

C++
1
b->f3();  с->f2();
будут вызваны методы класса А.

В общем как это устранить при вышеизложенных требований.


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
#include <iostream>
using namespace std;
 
class A
{
    public:
    virtual~A() {}
    virtual void f1() = 0;
    virtual void f2() {cout<<"f2() class A"<<endl;}
    virtual void f3() {cout<<"f3() class A"<<endl;}
};
class B : public A
{
    public:
    void f1() {cout<<"f1() class B"<<endl;}
    void f2() {cout<<"f2() class B"<<endl;}
};
class C : public A
{
    public:
    void f1() {cout<<"f1() class C"<<endl;}
    void f3() {cout<<"f3() class C"<<endl;}
};
 
int main() 
{
    A *b = new B;
    A *c = new C;
    b->f1();
    b->f2();
        b->f3();      //????????????????????????????????????????
    cout<<"********************"<<endl;
    c->f1();
        c->f2();   //????????????????????????????????????????
    c->f3();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 12:03
Ответы с готовыми решениями:

Сложность абстракции, полиморфизм, дублирование и другие
//структура &quot;матрица&quot; //Представляет собой обёртку над двухмерным массивом...

Чего стоит использование абстракции типов данных?
Здравствуйте! Я ещё зелёный в этом деле, только учусь (на первом курсе), и...

Создать базовый класс, использовать свойства полиморфизма и абстракции
Создать базовый класс &quot; Транспортное средство&quot; и производные классы:...

Какая-то неопределенность при наследовании
Всем привет! Прошу помощи. Суть: //A.h class A { A(); virtual...

Entity Framework и абстракции
Можно сказать &quot;новичковый&quot; вопрос :) Есть сущности, созданные из базы данных....

22
egor2116
572 / 376 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
02.07.2016, 12:36 2
В общем как это устранить при вышеизложенных требований.
удалите из
класс A
методы
C++
1
2
virtual void f2() {cout<<"f2() class A"<<endl;}
    virtual void f3() {cout<<"f3() class A"<<endl;}
и сделайте виртуальными их в нужных классах

Вы сами себе придумали ошибку
0
RAFA91
Заблокирован
02.07.2016, 12:42  [ТС] 3
ага щас. теперь вообще не фурычет. и ясен пень почему

prog.cpp: In function 'int main()':
prog.cpp:29:8: error: 'class A' has no member named 'f2'
b->f2();
^
prog.cpp:33:8: error: 'class A' has no member named 'f3'
c->f3();

удалять не катит.

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
#include <iostream>
using namespace std;
 
class A
{
    public:
    virtual~A() {}
    virtual void f1() = 0;
 
};
class B : public A
{
    public:
    virtual void f1() {cout<<"f1() class B"<<endl;}
    virtual void f2() {cout<<"f2() class B"<<endl;}
};
class C : public A
{
    public:
   virtual void f1() {cout<<"f1() class C"<<endl;}
   virtual void f3() {cout<<"f3() class C"<<endl;}
};
 
int main() 
{
    A *b = new B;
    A *c = new C;
    b->f1();
    b->f2();
 
    cout<<"********************"<<endl;
    c->f1();
    c->f3();
 
    return 0;
}
0
Mr.X
Эксперт С++
3183 / 1710 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:37 4
Цитата Сообщение от RAFA91 Посмотреть сообщение
у класса B не должно быть метода f3(), а у С метода f2()
Цитата Сообщение от RAFA91 Посмотреть сообщение
вся опасность в этом
C++
1
b->f3(); с->f2();
будут вызваны методы класса А.
В общем как это устранить при вышеизложенных требований.
Ну, если этих функций не должно быть, но они могут вызываться, то что здесь можно придумать кроме исключений?
0
RAFA91
Заблокирован
02.07.2016, 14:45  [ТС] 5
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, если этих функций не должно быть, но они могут вызываться, то что здесь можно придумать кроме исключений?
да думал я в эти тела запихнуть исключения - но не сильно мне нравится этот подход.

еще можно тупо написать так

C++
1
2
3
4
5
6
7
8
class A
{
    public:
    virtual~A() {}
    virtual void f1() = 0;
    virtual void f2() = 0;
    virtual void f3() = 0;
};
но тогда f2() и f3() должно быть в производных.

а мне это не надо. только то что действительно относится к этому классу.


у класса B не должно быть метода f3(), а у С метода f2()

может вести какой-то дополнительный класс ?
0
Mr.X
Эксперт С++
3183 / 1710 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:51 6
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
0
RAFA91
Заблокирован
02.07.2016, 14:53  [ТС] 7
Цитата Сообщение от Mr.X Посмотреть сообщение
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
не понял о чем Вы. исходный код проблемы находится в посте 1.
0
Mr.X
Эксперт С++
3183 / 1710 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:56 8
Цитата Сообщение от RAFA91 Посмотреть сообщение
не понял о чем Вы. исходный код проблемы находится в посте 1.
Ну, общая часть у классов B и C - это функция f1, зачем пихать в базовый класс что-то еще?
0
RAFA91
Заблокирован
02.07.2016, 14:58  [ТС] 9
Цитата Сообщение от Mr.X Посмотреть сообщение
в базовый класс что-то еще?
хотя бы потому , что мне надо что-бы работало это

C++
1
2
 A *b = new B;
    A *c = new C;
называйте это полиморфизмом или чем то еще.

C++
1
2
3
4
5
6
 b->f1();
    b->f2();
 
    cout<<"********************"<<endl;
    c->f1();
    c->f3();
0
Mr.X
Эксперт С++
3183 / 1710 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 15:03 10
Цитата Сообщение от RAFA91 Посмотреть сообщение
хотя бы потому , что мне надо что-бы работало это
C++
1
2
A *b = new B;
 A *c = new C;
называйте это полиморфизмом или чем то еще.
Ну, если вы перенесете функции f2 и f3 из базового в потомки - оно не перестанет работать.
0
RAFA91
Заблокирован
02.07.2016, 15:07  [ТС] 11
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, если вы перенесете функции f2 и f3 из базового в потомки - оно не перестанет работать.
в сообщении 3 все про это уже оговорено и проверенно на практике.

Работать не будет !!!

динамик каст даже не предлагайте.
0
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 16:05 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
public:
    virtual void F1() = 0;
    virtual void F2()
    {
 
    }
     void F3()
    {
 
    }
};
 
class B : public A
{
public:
     void F3() = delete;
};
0
RAFA91
Заблокирован
02.07.2016, 16:10  [ТС] 13
не шибко хочиться что-бы в абстрактном классе была реализация чего либо.

с такими пирогами можно абсолютно все запихнуть в базовый класс.


это че
C++
1
void F3() = delete;
0
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 16:55 14
удаленный метод, в гугле default and delete
напишите delete после метода в классе производном от базового и тем самым запретите вызов и использование метода
0
RAFA91
Заблокирован
02.07.2016, 16:58  [ТС] 15
Цитата Сообщение от the11011 Посмотреть сообщение
использование метода

а че тут не поставил виртуал

C++
1
2
3
4
void F3()
    {
 
    }
в идеале меня бы устроило это

C++
1
2
3
4
5
6
7
8
class A
{
    public:
    virtual~A() {}
    virtual void f1() = 0;
    virtual void f2() = 0;
    virtual void f3() = 0;
};
0
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:01 16
удалить виртуальный метод невозможно, а простой можно

"У этих классов есть общий метод f1(). " - не сказано что он должен быть виртуальным
0
RAFA91
Заблокирован
02.07.2016, 17:06  [ТС] 17
Цитата Сообщение от the11011 Посмотреть сообщение
удалить виртуальный метод невозможно, а простой можно
ну та же хрень тогда что и в посте 1.

абстрактный класс имеет реализацию производного.

не - надо думать иначе наверное.

попробуй ввести дополнительные классы.
0
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:10 18
http://stackoverflow.com/questions/2...-derived-class
0
RAFA91
Заблокирован
02.07.2016, 17:14  [ТС] 19
Цитата Сообщение от the11011 Посмотреть сообщение
http://stackoverflow.com/questions/2...-derived-class
я понял. подумай может стоит ввести дополнительный класс для решения этой задачи ?

если уж нечего нету, тогда оставим то что в посте 1, но в методы базового запихнем исключения.
0
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:27 20
можно попробовать через sealed и пару вспомогательных классов
0
02.07.2016, 17:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2016, 17:27

Изучение инкапсуляции и абстракции
Всем доброго вечера у меня очередная лабораторка. Завдання. Створити на мові...

Абстракция, уровни абстракции
Как понять это? Может кто-нибудь объяснить более доступным и понятным языком...

Написать код программы (Абстракции)
Всем доброго времени суток. Имеется одна задача, которую я не могу решить в...


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

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

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