Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Заблокирован
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.

Есть класс 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2016, 12:03
Ответы с готовыми решениями:

Абстракции
Мои работы в стиле абстракций. Работа выполненная несколько месяцев назад.

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

Задачка с использованием абстракции
Добрый день! подскажите(объясните:)) пожалуйста, что еще необходимо сделать с данной задачей с...

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

22
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
Заблокирован
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
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:37 4
Цитата Сообщение от RAFA91 Посмотреть сообщение
у класса B не должно быть метода f3(), а у С метода f2()
Цитата Сообщение от RAFA91 Посмотреть сообщение
вся опасность в этом
C++
1
b->f3(); с->f2();
будут вызваны методы класса А.
В общем как это устранить при вышеизложенных требований.
Ну, если этих функций не должно быть, но они могут вызываться, то что здесь можно придумать кроме исключений?
0
Заблокирован
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
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:51 6
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
0
Заблокирован
02.07.2016, 14:53  [ТС] 7
Цитата Сообщение от Mr.X Посмотреть сообщение
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
не понял о чем Вы. исходный код проблемы находится в посте 1.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 14:56 8
Цитата Сообщение от RAFA91 Посмотреть сообщение
не понял о чем Вы. исходный код проблемы находится в посте 1.
Ну, общая часть у классов B и C - это функция f1, зачем пихать в базовый класс что-то еще?
0
Заблокирован
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
Эксперт С++
3225 / 1752 / 436
Регистрация: 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
Заблокирован
02.07.2016, 15:07  [ТС] 11
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, если вы перенесете функции f2 и f3 из базового в потомки - оно не перестанет работать.
в сообщении 3 все про это уже оговорено и проверенно на практике.

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

динамик каст даже не предлагайте.
0
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
Заблокирован
02.07.2016, 16:10  [ТС] 13
не шибко хочиться что-бы в абстрактном классе была реализация чего либо.

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


это че
C++
1
void F3() = delete;
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 16:55 14
удаленный метод, в гугле default and delete
напишите delete после метода в классе производном от базового и тем самым запретите вызов и использование метода
0
Заблокирован
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
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:01 16
удалить виртуальный метод невозможно, а простой можно

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

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

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

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

если уж нечего нету, тогда оставим то что в посте 1, но в методы базового запихнем исключения.
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:27 20
можно попробовать через sealed и пару вспомогательных классов
0
02.07.2016, 17:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2016, 17:27
Помогаю со студенческими работами здесь

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

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

Права доступа, уровень абстракции
Использую Asp.net 4, в качестве провайдера доступа использую пока свой, похожий на membership. В...

Доработать программу(выделение уровней абстракции и т.д.)
Здравствуйте, нужно написать программу, которая бы по части имени или по регулярному выражению...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru