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

Не получается создать объект унаследованный от абстрактного класса

08.03.2015, 14:04. Показов 3251. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Нужна помощь с виртуальными функциями, в теории понимаю что это, а вот с реализацией что-то совсем не получается.

Нужно написать абстрактный класс Фигура, от которого наследуется класс круг.
Вот код:

Абстрактный класс:
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
//абстрактный класс
class GeometricFigure
{
public:
    GeometricFigure();
    ~GeometricFigure();
    //виртуальный метод показа фигуры
    virtual void show() =0;
};
Производный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
#include "geometricfigure.h"
class Circle :
    public GeometricFigure
{
public:
    Circle(void);
    ~Circle(void);
    //поля класса
    float r;
    //интерфейс виртуальных методов
    void Show(){
        cout<<"Krug";
    }
};
Главная функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Lab4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "iostream"
 
//интерфейсы классов
#include "GeometricFigure.h"
#include "Circle.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    GeometricFigure* gfPtr;
    Circle c;
 
    system ("pause");
    return 0;
Ошибка в строчке
C++
1
Circle c;
Использование абстрактного класса не допускается. (скрин во вложениях)
Делаю по примеру из книги "ООП в С++" Роберта Лафоре, там сделано именно так. (скрин во вложениях)
Как это исправить, объясните, пожалуйста.

Ну и пользуясь случаем, еще попутный вопрос:
Для чего создаются указатели на классы? Точнее, для чего указателю, присваивается адрес наследника?
Читал на MSDN, что-то до меня дошло. Можете посоветовать справочники в которых это все подробно рассматривается?
Миниатюры
Не получается создать объект унаследованный от абстрактного класса   Не получается создать объект унаследованный от абстрактного класса  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2015, 14:04
Ответы с готовыми решениями:

Ошибка: невозможно создать объект абстрактного класса
программа для заменны слова в файле, на введенное с клавы слово!реализовать нужно через интерфейс! ошибка в строчке Text edit; не...

Создать новый объект-наследник абстрактного класса
Приветствую, друзья! У нас есть абстрактный класс AbstractClass и его наследники child1 и child2. В массиве у нас есть несколько...

Не получается создать экземпляр абстрактного класса
в общем я очень тупой, буду благодарен за умные советы, имеется класс object и наследуемые от него triangle и uravn вот фрагмент из мэйна ...

7
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.03.2015, 14:15
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
virtual void show() =0;
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
void Show(){ cout<<"Krug"; }
Разницу в имени замечаете ?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.03.2015, 14:16
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
virtual void show() =0;
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
void Show(){
найдите различия

Кликните здесь для просмотра всего текста
в базовом классе имя метода с маленькой буквы
1
5 / 5 / 3
Регистрация: 20.10.2013
Сообщений: 68
08.03.2015, 14:17
Для начала, надо бы назвать методы одинаково (С++ чувствителен к регистру).
Во-вторых, надо реализовать конструкторы и деструкторы обоих классов (в данном случае они ничего не делают).

Код:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
class GeometricFigure
{
public:
    GeometricFigure() {}; //реализуем
    ~GeometricFigure() {}; //реализуем
    //виртуальный метод показа фигуры
    virtual void show() =0;  //маленькие буквы
};
 
class Circle :
    public GeometricFigure
{
public:
    Circle(void) {}; //реализуем 
    ~Circle(void) {}; //реализуем
    //поля класса
    float r;
    //интерфейс виртуальных методов
    void show(){   //маленькие буквы
        cout<<"Krug";
    }
};
 
int main()
{
    GeometricFigure* gfPtr;
    Circle c;
 
    return 0;
}
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
08.03.2015, 14:33  [ТС]
Цитата Сообщение от galayko Посмотреть сообщение
С++ чувствителен к регистру
Это я знаю, просто как всегда не внимательность, спасибо что заметили

Цитата Сообщение от galayko Посмотреть сообщение
Во-вторых, надо реализовать конструкторы и деструкторы обоих классов
Это сделано в отдельном файле.

С этим вопросом ясно, а насчет этого кто подскажет?
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Для чего создаются указатели на классы? Точнее, для чего указателю, присваивается адрес наследника?
Читал на MSDN, что-то до меня дошло. Можете посоветовать справочники в которых это все подробно рассматривается?
0
5 / 5 / 3
Регистрация: 20.10.2013
Сообщений: 68
08.03.2015, 14:51
Ну смотри:
Есть у тебя абстрактный класс GeometricFigure с виртуальным методом show().
И есть классы, унаследованные от него Square, Circle и Triangle. У каждого из них метод show() переопределен.
Суть в том, что ты можешь хранить объекты Square, Circle и Triangle в массиве указателей на базовый класс, то есть на GeometricFigure и вызывать их перегруженные методы.
Пример:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
 
using namespace std;
 
//базовый класс
class GeometricFigure
{
public:
    GeometricFigure() {}
    ~GeometricFigure() {}
    //виртуальный метод показа фигуры
    virtual void show() =0;
};
//наследник
class Circle :
    public GeometricFigure
{
public:
    Circle(void) {}
    ~Circle(void) {}
    //поля класса
    float r;
    //интерфейс виртуальных методов
    void show(){
        cout << "Krug" << endl;
    }
};
//наследник
class Triangle :
    public GeometricFigure
{
public:
    Triangle(void) {}
    ~Triangle(void) {}
    //поля класса
    float r;
    //интерфейс виртуальных методов
    void show(){
        cout << "Triangle" << endl;
    }
};
//наследник
class Square :
    public GeometricFigure
{
public:
    Square(void) {}
    ~Square(void) {}
    //поля класса
    float r;
    //интерфейс виртуальных методов
    void show(){
        cout << "Square" << endl;
    }
};
 
int main()
{
    //массив указателей на базовый класс
    GeometricFigure *gfPtr[3];
    //создадим объекты разных классов
    Circle *c = new Circle();
    Triangle *t = new Triangle();
    Square *s = new Square();
    //добавим их в массив указателей на базовый класс
    gfPtr[0] = c;
    gfPtr[1] = t;
    gfPtr[2] = s;
    //вызовем у каждого объекта метод show()
    for (int i = 0; i < 3; i++)
        gfPtr[i]->show();
 
 
    return 0;
}
В таком случае выведется:
Circle
Triangle
Square
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
08.03.2015, 15:23  [ТС]
galayko, вот только что разбираясь с вышеописанным кодом, я это и понял, спасибо.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.03.2015, 17:30
Чтобы не было таких проблем, рекомендую добавлять к переопределяемой в производном классе модификатор override. Если он указан, проблемы с регистром или константностью методов отлавливаются моментально.
P.s. Нужен как минимум c++11
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2015, 17:30
Помогаю со студенческими работами здесь

Самодельная библиотека, не получается создать объект класса
Добрый вечер. Сделал на досуге небольшую библиотеку (по шаблону QtCreator). Содержит 12 классов. Решил ее протестировать: создал новый...

Создается объект абстрактного класса:(
Вот допустим у меня есть класс: class Cell { public: Cell() {} ~Cell() {} virtual std::string getData() const = 0; }; Ну...

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock = class(TOgmGraphicsItem) (Объект класса...

Создать екземпляр из абстрактного класса
Привет всем, мне нужно в функции получить объект абстрактного класса, и создать новый объект этого же типа, но не понимаю как это сделать. ...

Невозможно создать экземпляр абстрактного класса
Делаю курсовик, сейчас на начальной стадии (а как же еще к концу сессии :D). Код, который я сейчас покажу еще &quot;сырой&quot;, а точнее...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru