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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Martinz
1 / 1 / 0
Регистрация: 04.01.2011
Сообщений: 37
#1

Наследование абстрактного класса, компилятор достал материться - C++

24.08.2012, 16:31. Просмотров 1681. Ответов 21
Метки нет (Все метки)

Уже весь мозг сломал, не понимаю, почему компилятор начинает ругаться.
Есть абстрактный базовый класс в отдельном хедере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
 
class Shape
{
public:
    /*virtual double Dist(const Shape&) = 0; //1. */
    virtual void Read() = 0;
    virtual void Move(int delta_x, int delta_y) = 0;
    virtual Shape& Draw() = 0;
    virtual ~Shape() {};
private:
    virtual bool Set(int,int) = 0;
};//Shape
Есть его наследник в отдельном хедере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "Shape.h"
 
class Point : public Shape
{
public:
    /*double Dist(const Point&); //2. */
    void Read();
    void Move(int delta_x, int delta_y);
    Point& Draw();
    ~Point();
    Point(int = 0, int = 0);
    Point(const Point&);
    Point& operator= (const Point&);
private:
    bool Set(int x_, int y_);
    int x, y;
};//Point
Описание класса Point отдельным файлом .cpp:
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
38
39
40
41
42
43
44
45
46
#include <iostream>
#include "math.h"
#include "Point.h"
 
using namespace std;
 
/*double Point::Dist(const Point& pt)
{
return 0;
}//Dist 3. */
 
void    Point::Read()
{
}//Read
 
void    Point::Move(int delta_x, int delta_y)
{
}//Move
 
bool    Point::Set(int x_, int y_)
{ 
}
 
Point&  Point::Draw()
{
return *this;
}//Draw
 
//Special methods
Point::~Point()
{
}//~Point
 
Point::Point(int x_, int y_)
{
}//Point
 
Point::Point(const Point& pt)
{
}//Point copy
 
//Redefined operators
Point& Point::operator= (const Point& rs)
{
return *this;
}//operator=
Я специально оставил функции пустыми, чтобы не отвлекал лишний текст. Вот в таком виде всё компилируется, ошибок НОЛЬ. Запросто создаются точки Point a,b, выполняются функции с ними.
Теперь убираем комментарии с номером 1, 2, 3 которые тут красным цветом выделены - иначе говоря добавляем в класс Shape вирт.функцию Dist, переопределяем её в классе Point, и при попытке создать точку Point a получаем ошибку:
C++
1
2
3
error C2259: 'Point' : cannot instantiate abstract class
1>          due to following members:
1>          'double Shape::Dist(const Shape &)' : is abstract
В припадке нубского недоумения ломаю клавиатуру и ругаюсь вслух, десять раз перепроверил, синтаксис вроде нигде не нарушен, создана вирт. функция в Shape, такая же функция записана в Point, переопределена, больше ничего не делал! Однако теперь мой класс Point принимается за абстрактный. А вместо объектов Point пытается создать объект Shape.

Укажите на ошибки пожалуйста, можете потроллить, если это очевидно, только объясните.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 16:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование абстрактного класса, компилятор достал материться (C++):

Наследование абстрактного класса - C++
Не могли бы вы мне объяснить данный код: Actions *NewAct = new Array(); // строка 1 ((Array *)NewAct)-&gt;Set_arr(count); // строка 2 ...

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Использование абстрактного класса - C++
Доброго времени. Использую абстрактный класс Algorithm с абстрактным методом Calculate() и 5 производных от него классов, реализующих тот...

Деструктор абстрактного класса - C++
Почему деструктор абстрактного класса нужно делать виртуальным?

Объекты абстрактного класса - C++
Разбираю пример. В программе задается сразу 6 объектов. А нужно, чтобы количество объектов вводилось пользователем с клавиатуры. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 23:58 #16
Почему нет? Если считать фигуру множеством точек, то всё окей. А линии вообще можно считать всего лишь парами точек.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
25.08.2012, 00:10 #17

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Точка не является фигурой.
математически не является
а физически очень маленький круг



Добавлено через 4 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Если считать фигуру множеством точек, то всё окей.
Цитата Сообщение от ForEveR Посмотреть сообщение
Только наследовать точку от Shape это простите трындец.
ForEveR, прав
какие такие свойства фигуры могут присутствовать в точке???(кроме координат)
логичней наследовать фигуру от точки
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Если считать фигуру множеством точек, то всё окей.
тогда класс точки отдельный а в фигуре массив точек
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.08.2012, 00:11 #18
~OhMyGodSoLong~, Ну вообщем да. Но логически наследование Point от Shape кажется несколько странным.
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:53 #19
ForEveR, согласен точка все же не фигура как не крути, так как она нульмерный объект.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:04 #20
Что значит нульмерный? Нет ширины/высоты/глубины? У прямой их тоже нет. У какого-нибудь открытого множества тоже.

И воще, завязывайте. Это философия всё.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 01:05 #21
ребята, вы уже о другом, о своем-о девичьем? ошибки-то быть не должно было бы: ф-я, которая pure virtual закомментирована. что-то у автора не то между тем что он пишет, и что он компилирует.
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 14:07 #22
~OhMyGodSoLong~, значит не имеет измерений (0-D по-другому.например: отрезок 1-D, треугольник 2-D, куб 3-D, тессеракт 4-D и т.д.).А прямая по вашему фигура?Фигура как раз прямыми и ограничена, но они не являются фигурами как и открытое множество.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 14:07
Привет! Вот еще темы с ответами:

Реализация абстрактного класса - C++
Создать абстрактный базовый класс Function (функция) с виртуальными методами вычисления значения функции у = f(x) в заданной точке х и...

Наследники абстрактного класса - C++
Есть классы: class A { public: virtual void met() = 0; }; class B : public A { public: virtual void met() const;

Ошибка компиляции абстрактного класса - C++
public: Tour(); Tour(const char *, int, float); Tour(const Tour &amp;); Tour &amp; operator = (const Tour &amp;) = delete ; ~Tour(); ...

Использование конструктора абстрактного класса - C++
Добрый вечер. Подскажите, как вызвать конструктор абстрактного класса из производного класса? Пытаюсь вызвать так: Advertising*...


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

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

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