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

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

Войти
Регистрация
Восстановить пароль
 
 
RAFA91
Заблокирован
#1

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

02.07.2016, 12:03. Просмотров 431. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неопределенность в абстракции (C++):

Сложность абстракции, полиморфизм, дублирование и другие - C++
//структура &quot;матрица&quot; //Представляет собой обёртку над двухмерным массивом template&lt;typename TypeT, int _SizeX, int _sizeY&gt; struct...

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

Создать базовый класс, использовать свойства полиморфизма и абстракции - C++
Создать базовый класс &quot; Транспортное средство&quot; и производные классы: &quot;Автомобиль&quot;, &quot;Мопед&quot;, &quot;Велосипед&quot;. Посчитать время и стоимость...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2016, 16:58
Привет! Вот еще темы с ответами:

Права доступа, уровень абстракции - C# MVC
Использую Asp.net 4, в качестве провайдера доступа использую пока свой, похожий на membership. В БД есть: 1)таблица Users, в ней есть...

Разработка гибкой абстракции больших масштабов - PHP
Не уверен что нужный форум, но лучшего не нашел. ,Возможно термины буду применять не совсем корректно, надеюсь все поймут. Есть некая идея...

Интерфейс для абстракции доступа к данным - Java EE
Доброго времени суток, форумчане! Объясните мне пожалуйста, как начинающему, на пальцах, как пользоваться фреймворком Spring...

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


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

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

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