Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Александр_Алекс
7 / 4 / 4
Регистрация: 08.12.2013
Сообщений: 165
1

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

08.03.2015, 14:04. Просмотров 714. Ответов 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
Миниатюры
Не получается создать объект унаследованный от абстрактного класса   Не получается создать объект унаследованный от абстрактного класса  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2015, 14:04
Ответы с готовыми решениями:

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

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

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

Создается объект абстрактного класса:(
Вот допустим у меня есть класс: class Cell { public: Cell() {} ~Cell()...

Невозможно создать экземпляр абстрактного класса
work.cpp #include &quot;student.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

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

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

Код:
Кликните здесь для просмотра всего текста
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
Александр_Алекс
7 / 4 / 4
Регистрация: 08.12.2013
Сообщений: 165
08.03.2015, 14:33  [ТС] 5
Цитата Сообщение от galayko Посмотреть сообщение
С++ чувствителен к регистру
Это я знаю, просто как всегда не внимательность, спасибо что заметили

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

С этим вопросом ясно, а насчет этого кто подскажет?
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Для чего создаются указатели на классы? Точнее, для чего указателю, присваивается адрес наследника?
Читал на MSDN, что-то до меня дошло. Можете посоветовать справочники в которых это все подробно рассматривается?
0
galayko
5 / 5 / 3
Регистрация: 20.10.2013
Сообщений: 68
08.03.2015, 14:51 6
Ну смотри:
Есть у тебя абстрактный класс 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
Александр_Алекс
7 / 4 / 4
Регистрация: 08.12.2013
Сообщений: 165
08.03.2015, 15:23  [ТС] 7
galayko, вот только что разбираясь с вышеописанным кодом, я это и понял, спасибо.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.03.2015, 17:30 8
Чтобы не было таких проблем, рекомендую добавлять к переопределяемой в производном классе модификатор override. Если он указан, проблемы с регистром или константностью методов отлавливаются моментально.
P.s. Нужен как минимум c++11
1
08.03.2015, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2015, 17:30

Не могу создать дочку абстрактного класса
Следующий код на MS Visual C++ 2010 даёт ошибку error C2259: 'IntValue' :...

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

error C2259: last: невозможно создать экземпляр абстрактного класса
Только начала изучать абстрактные классы, и сразу же проблемы. error C2259:...


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

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

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