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

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

Восстановить пароль Регистрация
 
 
RAFA91
Заблокирован
02.07.2016, 12:03     Неопределенность в абстракции #1
Добрый день.

Есть класс 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
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;}
и сделайте виртуальными их в нужных классах

Вы сами себе придумали ошибку
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;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
02.07.2016, 14:37     Неопределенность в абстракции #4
Цитата Сообщение от RAFA91 Посмотреть сообщение
у класса B не должно быть метода f3(), а у С метода f2()
Цитата Сообщение от RAFA91 Посмотреть сообщение
вся опасность в этом
C++
1
b->f3(); с->f2();
будут вызваны методы класса А.
В общем как это устранить при вышеизложенных требований.
Ну, если этих функций не должно быть, но они могут вызываться, то что здесь можно придумать кроме исключений?
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()

может вести какой-то дополнительный класс ?
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
02.07.2016, 14:51     Неопределенность в абстракции #6
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
RAFA91
Заблокирован
02.07.2016, 14:53  [ТС]     Неопределенность в абстракции #7
Цитата Сообщение от Mr.X Посмотреть сообщение
RAFA91, вы наследование как-то задом наперед используете. Может проще вверху разделить эту функциональность, чем внизу ограничивать?
не понял о чем Вы. исходный код проблемы находится в посте 1.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
02.07.2016, 14:56     Неопределенность в абстракции #8
Цитата Сообщение от RAFA91 Посмотреть сообщение
не понял о чем Вы. исходный код проблемы находится в посте 1.
Ну, общая часть у классов B и C - это функция f1, зачем пихать в базовый класс что-то еще?
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();
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
02.07.2016, 15:03     Неопределенность в абстракции #10
Цитата Сообщение от RAFA91 Посмотреть сообщение
хотя бы потому , что мне надо что-бы работало это
C++
1
2
A *b = new B;
 A *c = new C;
называйте это полиморфизмом или чем то еще.
Ну, если вы перенесете функции f2 и f3 из базового в потомки - оно не перестанет работать.
RAFA91
Заблокирован
02.07.2016, 15:07  [ТС]     Неопределенность в абстракции #11
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, если вы перенесете функции f2 и f3 из базового в потомки - оно не перестанет работать.
в сообщении 3 все про это уже оговорено и проверенно на практике.

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

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

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


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

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

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

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

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

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

Java EE Интерфейс для абстракции доступа к данным
C++ Создать базовый класс, использовать свойства полиморфизма и абстракции
C# Абстракция, уровни абстракции

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

Или воспользуйтесь поиском по форуму:
the11011
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 5
02.07.2016, 17:27     Неопределенность в абстракции #20
можно попробовать через sealed и пару вспомогательных классов
Yandex
Объявления
02.07.2016, 17:27     Неопределенность в абстракции
Ответ Создать тему
Опции темы

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