3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 37
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Наследование абстрактного класса, компилятор достал материться24.08.2012, 16:31. Показов 3686. Ответов 21
Метки нет (Все метки)
Уже весь мозг сломал, не понимаю, почему компилятор начинает ругаться.
Есть абстрактный базовый класс в отдельном хедере:
Теперь убираем комментарии с номером 1, 2, 3 которые тут красным цветом выделены - иначе говоря добавляем в класс Shape вирт.функцию Dist, переопределяем её в классе Point, и при попытке создать точку Point a получаем ошибку:
Укажите на ошибки пожалуйста, можете потроллить, если это очевидно, только объясните.
0
|
24.08.2012, 16:31 | |
Ответы с готовыми решениями:
21
Наследование абстрактного класса Наследование от абстрактного класса. Наследование от абстрактного класса Можно ли реализовать наследование абстрактного класса |
3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 37
|
|
24.08.2012, 16:43 [ТС] | 3 |
Всё равно ругается, что 'Point' : cannot instantiate abstract class, вообще с приватной функцией Set() никаких проблем нету, она нормально наследуется и работает и как private и как public, ошибки появляются, когда ввожу новую чисто виртуальную функцию Dist, не могу понять, почему.
0
|
24.08.2012, 16:49 | 4 |
как она принимает в аргументах ссылку на свой тип, если его нельзя создать?
вот тут /*virtual double Dist(const Shape&) = 0; //1. */ на сколько я понял именно об этом и говорится в ошибке Код
error C2259: 'Point' : cannot instantiate abstract class 1> due to following members: 1> 'double Shape::Dist(const Shape &)' : is abstract
1
|
3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 37
|
||||||
24.08.2012, 16:58 [ТС] | 5 | |||||
Точно, спасибо! То есть нельзя создавать чисто виртуальные функции с указателем на объект абстрактного класса. Значит вообще от этой функции придется отказаться...
Но, кстати, в ошибке все-таки указано на другое, я наконец-то понял. У меня в абстрактном классе функция Dist с аргументом Shape&, а в потомке такая же функция с аргументом Point&, компилятор воспринимает эти функции как разные, полиморфизм не работает, то бишь в моем потомке оказывается две функции:
Только скажите пожалуйста, увидеть воочию все наследованные данные в VS2010 как нибудь можно? Через Class View наследованные данные не отображаются.
0
|
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
|
|
24.08.2012, 19:05 | 7 |
Martinz, Мое предположение:чистую виртуальную функцию объявить в public,т.к. чисто виртуальную фун-цию в надо инициализировать в производных классах, если она есть в базовом. А как вы это сделаете, если у вас к ней закрытый доступ?
Не по теме:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
24.08.2012, 19:09 | 8 | |||||
4iFF, Без проблем можно.
0
|
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
|
|
24.08.2012, 19:24 | 9 |
тут C* c не проверяется, что такое С и сразу создается D, так что пример не годится
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
24.08.2012, 19:27 | 10 |
10.3/3 стандарта, если что. И /2. Переопределение проводится исключительно по имени функции, списку параметров и квалификаторам const/volatile. Область видимости роли не играет. С равным (плачевным) успехом можно (нечаянно) переопределять функции и через десяток классов в иерархии. Именно поэтому не рекомендуется делать private-функции виртуальными.
defer, а что с примером не так? Естественно, экземпляр С создать нельзя. Суть примера в том, что переопределить private виртуальную функцию можно в производных классах без проблем. И даже дать ей другой квалификатор доступа.
1
|
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
|
|
24.08.2012, 19:33 | 11 |
0
|
3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 37
|
|
24.08.2012, 21:01 [ТС] | 12 |
Кстати спасибо за это интересное уточнение, не знал, что при наследовании можно менять квалификатор доступа, очень во время вы об этом написали. Выходит, если например в базовом абстрактном классе Shape есть виртуальная функция center, вычисляющая центр объекта Shape, которая не имеет смысла в производном классе Point, я переношу её там в private, тем самым запрещая выполнять абсурдную операцию вычисления центра точки, а в классе Line или Circle я оставляю её в public.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.08.2012, 21:09 | 13 |
Martinz, Можно конечно. Только наследовать точку от Shape это простите трындец.
0
|
3 / 3 / 0
Регистрация: 04.01.2011
Сообщений: 37
|
|
24.08.2012, 21:54 [ТС] | 14 |
Да ну, прям таки трындец) Если Shape это абстрактный объект некоторой формы, почему бы точки, линии, круги и квадраты не отнести к Shape, и затем, например, в массиве Shape* arr[n] хранить указатели на все существующие объекты.
Может название не очень и стоило бы назвать не shape, а graphics или вроде того.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.08.2012, 23:45 | 15 |
Martinz, Точка не является фигурой. Линия является. Разницу улавливаете?
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
24.08.2012, 23:58 | 16 |
Почему нет? Если считать фигуру множеством точек, то всё окей. А линии вообще можно считать всего лишь парами точек.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
|
|
25.08.2012, 00:10 | 17 |
Добавлено через 4 минуты ForEveR, прав какие такие свойства фигуры могут присутствовать в точке???(кроме координат) логичней наследовать фигуру от точки тогда класс точки отдельный а в фигуре массив точек
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.08.2012, 00:11 | 18 |
~OhMyGodSoLong~, Ну вообщем да. Но логически наследование Point от Shape кажется несколько странным.
0
|
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
|
|
25.08.2012, 00:53 | 19 |
ForEveR, согласен точка все же не фигура как не крути, так как она нульмерный объект.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
25.08.2012, 01:04 | 20 |
Что значит нульмерный? Нет ширины/высоты/глубины? У прямой их тоже нет. У какого-нибудь открытого множества тоже.
И воще, завязывайте. Это философия всё.
0
|
25.08.2012, 01:04 | |
25.08.2012, 01:04 | |
Помогаю со студенческими работами здесь
20
Задача на наследование с использованием абстрактного класса Как компилятор различает две перегрузки метода абстрактного класса в инстанцированном классе потомке? Запрет наследование абстрактного метода Как обратится к обьекту класса, являющегося наследником абстрактного класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |