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

Нюансы использования абстрактных базовых классов (класс Shape)

18.12.2015, 20:26. Просмотров 313. Ответов 10
Метки нет (Все метки)

У меня класс Point наследуется с абстрактного базового класса Shape, и Point тоже абстрактный, поскольку не определил функцию get_area(). Знаю, что не могу создать обьект класса Point, но как мне работать с функциями point, с помощью указателя, если не позволяет инициализировать ( в main). Не очень хорошо понимаю абстракцию. Дайте ключевые понятия плиз.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
class Shape {
public:
    virtual void print()=0;
    virtual double get_area()=0;
    virtual~ Shape() {}
};
class Point :public Shape {
    double x;
    double y;
public:
    Point(double X=0, double Y=0) {x=X; y=Y;}
    double get_xP()const {return x;}
    double get_yP()const {return y; }
    void print() {std::cout<<"Print point : ("<<x<<","<<y<<")\n";}
};
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include "inh.h"
int main() {
    Point* P=new Point; //???
    P->print(); //???
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2015, 20:26
Ответы с готовыми решениями:

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных...

Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи
Создать программу с абстрактным базовым классом и множественным наследованием,...

Класс наследуемый от двух базовых классов
Друзья Являеться ли класс (А)- Классом наследуемым от двух базовых классов?...

Создать не менее 2-х базовых классов и класс, наследующий их поля
Используя условия задач из лабораторной работы № 12-13, разработайте алгоритм и...

Модель электронного устройства с использованием абстрактных классов
Здравствуйте, уважаемые форумчане! Продолжаю готовиться к экзамену по Real...

10
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.12.2015, 20:42 2
Цитата Сообщение от DavidTs Посмотреть сообщение
и Point тоже абстрактный, поскольку не определил функцию get_area().
Что мешает определить?
0
DavidTs
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
18.12.2015, 21:12  [ТС] 3
nord_v, А как определить площадь точки?. Ну и вопрос вообще то был про подобных ситуациях, а не конкретно здесь.
0
Байт
Эксперт C
18527 / 12032 / 2508
Регистрация: 24.12.2010
Сообщений: 24,324
18.12.2015, 21:21 4
Цитата Сообщение от DavidTs Посмотреть сообщение
А как определить площадь точки?
C++
1
double get_area() { return 0; }
А так-то пока все чисто виртуальные методы не определишь, экземпляр не создастся

Добавлено через 1 минуту
Цитата Сообщение от DavidTs Посмотреть сообщение
про подобных ситуациях
Ну вот аналогично и определяй...
1
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.12.2015, 21:22 5
Цитата Сообщение от DavidTs Посмотреть сообщение
Ну и вопрос вообще то был про подобных ситуациях, а не конкретно здесь.
Хоть конкретно здесь, хоть не конкретно здесь:
Цитата Сообщение от Байт Посмотреть сообщение
пока все чисто виртуальные методы не определишь, экземпляр не создастся
1
DavidTs
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
18.12.2015, 21:33  [ТС] 6
Байт, nord_v, Спасибо вас, начинаю что то понять, но походу еще много вопросов будут.
Так это правильный подход, всегда что бы избежать от абстракций какого то класса (в иерархии) просто взять все функции базового класса которые не имеют смысл в производном классе определить так, чтоб возвращал абсурдное значение(определить так чтоб не имел смысл)?
0
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.12.2015, 21:37 7
Цитата Сообщение от DavidTs Посмотреть сообщение
просто взять все функции базового класса которые не имеют смысл в производном классе определить так, чтоб возвращал абсурдное значение(определить так чтоб не имел смысл)?
Не все и возвращают, тогда можно просто пустое тело задать. А в данном примере, не так уж и бессмысленно, ведь точка не имеет площади, значит площадь точки нулевая.
0
Байт
Эксперт C
18527 / 12032 / 2508
Регистрация: 24.12.2010
Сообщений: 24,324
18.12.2015, 21:44 8
Цитата Сообщение от DavidTs Посмотреть сообщение
чтоб возвращал абсурдное значение(определить так чтоб не имел смысл)?
Ну почему абсурдное? Точка ведь и впрямь имеет нулевую площадь!
Но вообще-то если реальный класс хочет наследоваться от абстрактного, он должен определить, "закрыть" все его чисто виртуальные методы. А уж как - это не важно. Если метод что-то возвращает - пусть он возвратит нуль. void-метод пусть просто ничего не делает.
Пример. Класс СОБАКА. Метод - void Поднять_Хвост(градус). class ЭРДЕЛЬ : СОБАКА. Так как у эрделей хвоста нет, то и поднимать нечего. Метод просто ничего не делает. Но написать это нужно: void Поднять_Хвост(градус) { }
1
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
18.12.2015, 21:44 9
А чтобы не было возможности вызывать такие функции, можно из в private-область поместить.
1
Байт
18.12.2015, 21:45
  #10

Не по теме:

nord_v, ну мы с вами прям в один голос поем...:)

0
DavidTs
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
18.12.2015, 21:54  [ТС] 11
Байт, nord_v, Спасибо вас, помогли очень, теперь ясно )
0
18.12.2015, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2015, 21:54

Ошибка в инициализации базовых классов
Привет. Пишу код из книги Лафоре. #include &lt;iostream&gt; using namespace std;...

Использование базовых и производных классов
Не могу решить задачу с классами помогите с решением. Создать класс String –...

Наследование функций базовых классов
Здравствуйте! Изучаю С++ по книге Р. Лафоре ООП С++ Примеры из главы 9...


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

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

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