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

Вопрос по наследованию - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
ramarren14
2 / 2 / 0
Регистрация: 14.07.2011
Сообщений: 49
09.11.2011, 17:48     Вопрос по наследованию #1
Уже неоднократно перечитывал главы про наследования и все равно до конца не разобрался.
Вот например у нас есть класс Четырехугольник, и мы создаем класс Прямоугольник.
И в том и в другом классе есть функции Площадь и если у них будет одинаковая сигнатура, то вызовется функция того класса, объект которого мы создали. Если же сигнатуры совпадать не будут, то нужно явно указать с помощью оператора ::.
Если мы сделаем функцию площади виртуальной, то при одинаковых сигнатурах вызовется функция своего класса. То же в случае разных сигнатур. То есть единственный плюс объявления функций виртуальными, это то что если мы создадим указатель на объект базового класса, он сможет указывать и на объект производного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
09.11.2011, 17:56     Вопрос по наследованию #2
Какая еще сигнатура?
Что-то мне подсказывает, что вы не внимательно читали, раз предположили такое
Цитата Сообщение от ramarren14 Посмотреть сообщение
он сможет указывать и на объект производного класса?
bretba
 Аватар для bretba
63 / 58 / 5
Регистрация: 24.07.2011
Сообщений: 343
09.11.2011, 18:00     Вопрос по наследованию #3
зарезервированное слово virtual у члена класса показывает, что этот член может иметь разную версию в наследованных классах(то есть разное описание).

Виртуальные функции очень удобно использовать в играх.К примеру есть базовый класс-"оружие",где есть виртуальная функция "пули".От этого класса наследуются такие классы как-"автомат","пистолет" и тд.У каждого оружия есть своя специфика стрельбы-у автомата постоянными,у пистолета-одиночными и тд.И вот чтобы,для каждого не писать отдельных функций,можно использовать ту виртуальную функцию "пули".И для каждого класса описание этой функции будет свое.Удобно?Удобно))
ramarren14
2 / 2 / 0
Регистрация: 14.07.2011
Сообщений: 49
09.11.2011, 18:03  [ТС]     Вопрос по наследованию #4
Джесс Либерти "Освой С++ за 21 день";
cтр 324: "Полиформизм в С++ развит настолько, что допускается присвоение указателям на базовый класс адресов объектов производных классов как это делается в следующем примере"
Mammal * Ptr=new Dog;
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
09.11.2011, 18:06     Вопрос по наследованию #5
Цитата Сообщение от ramarren14 Посмотреть сообщение
cтр 324: "Полиформизм в С++ развит настолько, что допускается присвоение указателям на базовый класс адресов объектов производных классов как это делается в следующем примере"
Mammal * Ptr=new Dog;
Где тут слово vitual?
LosAngeles
Заблокирован
09.11.2011, 18:07     Вопрос по наследованию #6
неудачный пример, нельзя наследовать прямоугольник от четырёхугольника
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
09.11.2011, 18:10     Вопрос по наследованию #7
C++
1
2
3
4
5
6
7
8
Shape *ShapeArray[3] ;
 
ShapeArray[0] = new Circl ;
ShapeArray[1] = new Rectang;
ShapeArray[2] = new Square;
 
for(int i = 0; i < 3; i++)
ShapeArray[i]->Draw() ;
все эти три класса производные класса snape в котором функция Draw объявлена ключевым словом virtual
в каждом из этих трёх классов ясть своя функция Draw
в данном случае программа сама разбирает с какой фигурой мы имеем дело
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
09.11.2011, 18:15     Вопрос по наследованию #8
Вот пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class Base 
{
public:
    void fun() { std::cout << "class Base\n"; };
};
 
class Derived: public Base
{
    void fun() { std::cout << "class Derived\n"; };
};
 
int main()
{
    Base *basePtr = new Derived;
    basePtr->fun(); // class Base
    system( "pause" );
    return 0;
}
Помечу вызывается функция класса Base? Потому что тип указателя - Base. Логично? Логично и это так.
А что если мы хотим вызвать функцию класса Derived?
Тогда добавляем спецификатор virtual для функции fun() в классе Base.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class Base 
{
public:
    virtual void fun() { std::cout << "class Base\n"; };
};
 
class Derived: public Base
{
    void fun() { std::cout << "class Derived\n"; };
};
 
int main()
{
    Base *basePtr = new Derived;
    basePtr->fun(); // class Derived
    system( "pause" );
    return 0;
}
Тут надо заметить, что если функция fun класса Base является виртуальной, то по умолчанию функция fun класса Derived тоже станет виртуальной( при наследовании, конечно ), а поэтому для наглядности можно написать так( это тоже самое, что и выше написано):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class Base 
{
public:
    virtual void fun() { std::cout << "class Base\n"; };
};
 
class Derived: public Base
{
    virtual void fun() { std::cout << "class Derived\n"; };
};
 
int main()
{
    Base *basePtr = new Derived;
    basePtr->fun(); // class Derived
    system( "pause" );
    return 0;
}
Bers
Заблокирован
09.11.2011, 18:51     Вопрос по наследованию #9
Цитата Сообщение от LosAngeles Посмотреть сообщение
неудачный пример, нельзя наследовать прямоугольник от четырёхугольника
можно.
LosAngeles
Заблокирован
09.11.2011, 18:54     Вопрос по наследованию #10
Цитата Сообщение от Bers Посмотреть сообщение
можно.
разумеется нет.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
09.11.2011, 18:54     Вопрос по наследованию #11
Цитата Сообщение от LosAngeles Посмотреть сообщение
разумеется нет.
Прямоугольник является четырехугольником. Разве нет?
Bers
Заблокирован
09.11.2011, 19:00     Вопрос по наследованию #12
Цитата Сообщение от LosAngeles Посмотреть сообщение
разумеется нет.
аргументируйте

Добавлено через 30 секунд
Цитата Сообщение от Chelioss Посмотреть сообщение
Прямоугольник является четырехугольником. Разве нет?
да. Именно поэтому, наследование правомерно.

Прямоугольник есть частный случай четырех угольника.
LosAngeles
Заблокирован
09.11.2011, 19:15     Вопрос по наследованию #13
нет, оно не правомерно. Скотт Мейерс в "Эффективном использовании С++. 55 советов" в 32 правиле объясняет почему
Bers
Заблокирован
09.11.2011, 19:41     Вопрос по наследованию #14
Цитата Сообщение от LosAngeles Посмотреть сообщение
нет, оно не правомерно. Скотт Мейерс в "Эффективном использовании С++. 55 советов" в 32 правиле объясняет почему
Специально открыл и прочитал. Ну так вот, по мнению Маерса, при открытом наследовании, потомок является частным случаем предка.

Это означает, что все функции, которые умеют работать с предком, должны сработать и с потомком.

И наоборот: те функции, которые специализированы для потомка - не сработают с предком.


Ну так вот, в нашем случае любые операции, над четырех угольником сработают и над прямоугольником.

А вот некоторые операции над прямоугольником, могут не сработать с четырех угольником.

Что касается примера Майерса по поводу прямоугольника и квадрата - он искусственный, и высосанный из пальца.

В частности, прямоугольник не обязан содержать разные длины примыкающих сторон.
И нет никакой беды в том, что у прямоугольника все стороны стали равны.

Если нужно обеспечить гарантию того, что в прямоугольнике длины прилегающих сторон должны быть обязательно разными - вот это уже надо делать отдельную сущность. Потмоу что такая фигура уже не "прямоугольник". Это что-то вроде "разностороннего прямоугольника", у которого ширина и высота обязательно должны быть разными.

То есть, понятно, что квадрат от "разностороннего прямоугольника" наследовать не корректно.

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

Поэтому, пример Майерса не удачный. Имхо.
bretba
09.11.2011, 19:43
  #15

Не по теме:

жесть вы тут диалог развели))

Сыроежка
Заблокирован
09.11.2011, 21:08     Вопрос по наследованию #16
Цитата Сообщение от LosAngeles Посмотреть сообщение
нет, оно не правомерно. Скотт Мейерс в "Эффективном использовании С++. 55 советов" в 32 правиле объясняет почему
Нельзя слепо следовать тому, что написано в книгах!
В данном конкретном примере заранее нельзя сказать, корректно ли такое наследование или нет, так как неизвестно, как определяется прямоугольник. Если для прямоугольника могут быть вызваны все открытые методы четырехугольника, то есть везде, где используется четырехугольник, можно поставить прямоугольник, то такое открытое наследование является корректным.
LosAngeles
Заблокирован
10.11.2011, 04:49     Вопрос по наследованию #17
Цитата Сообщение от Bers Посмотреть сообщение
Что касается примера Майерса по поводу прямоугольника и квадрата - он искусственный, и высосанный из пальца.
В частности, прямоугольник не обязан содержать разные длины примыкающих сторон.
И нет никакой беды в том, что у прямоугольника все стороны стали равны.
Разумеется в этом нет никакой беды, наверно поэтому мейерс и не обмолвился ни словом об этой проблеме? Не знаю какого мейерса читаешь ты, но в моей книги ничего подобного не написано. В моей написан пример, в результате которого я получаю квадрат с разными сторонами, что делает проблематичным дальнейшее его использование.
Цитата Сообщение от Bers Посмотреть сообщение
Но так же не корректно называть прямоугольник прямоугольником, а потом ассертами запрещать ему иметь одинаковые стороны.
да никто и не запрещал, по крайней мере в 32 правиле издания 2006 года ничего подобного нет!
Bers
Заблокирован
10.11.2011, 05:15     Вопрос по наследованию #18
Цитата Сообщение от LosAngeles Посмотреть сообщение
Разумеется в этом нет никакой беды, наверно поэтому мейерс и не обмолвился ни словом об этой проблеме?
а ассерт он так просто, для красоты впиндюрил в базовый класс, да?

Добавлено через 16 минут
то есть в пардон, не базовый, а в манипулятор над классом предка
LosAngeles
Заблокирован
10.11.2011, 05:36     Вопрос по наследованию #19
Не понимаю о чём ты. Я так понял ты намекаешь на то, что какой то ассерт запрещает нам иметь равносторонний прямоугольник? Нет не запрещает, в чём проблема то? Там есть ассерт который запрещает иметь разносторонний квадрат, что вполне логично и правомерно. Собственно на это и обращается внимание
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2011, 06:13     Вопрос по наследованию
Еще ссылки по теме:

C++ Написать простейшую программу по "перегрузке" и "наследованию"
Вопросы по наследованию C++

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
10.11.2011, 06:13     Вопрос по наследованию #20
Цитата Сообщение от LosAngeles Посмотреть сообщение
Не понимаю о чём ты. Я так понял ты намекаешь на то, что какой то ассерт запрещает нам иметь равносторонний прямоугольник? Нет не запрещает, в чём проблема то? Там есть ассерт который запрещает иметь разносторонний квадрат, что вполне логично и правомерно. Собственно на это и обращается внимание
Ну мне что, сюда спокипастить эту идиотскую функцию?

void makebigger(Rectange& r); //что за идиотский ассерт запихал в неё Маерс, и что он имел ввиду? Обрати внимание, в качестве аргумента принимается прямоугольник, а не квадрат. Что за ДИБИЛИЗМ? Вешать ассерт, запрещающий прямоугольнику иметь разные примыкающие стороны?

тело функции:
C++
1
2
3
4
5
6
void makeBigger(rectange& r)
{
int old = r.height();
r.setWidth( r.width()+10);
assert( r.height() == old )
}
Теперь объясните мне пожалуйста, с точки зрения здравого смысла, зачем нужен такой дибильный ассерт, и какое отношение это имеет к наследованию?

Добавлено через 24 минуты
ой... не разные, а наоборот обязательное одинаковые. Тьху ты блин...
Yandex
Объявления
10.11.2011, 06:13     Вопрос по наследованию
Ответ Создать тему
Опции темы

Текущее время: 10:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru