В этом уроке мы поговорим о наследовании в C ++, очень интересной теме, и рассмотрим ее на простом примере. Для тех, кто работает в Windows, вы можете загрузить IDE в программу, это поможет вам скомпилировать и запустить программы, вот ссылка:
DEVC ++
Здесь мы собираемся использовать Linux, в частности Ubuntu, в котором уже есть компилятор для C ++. Язык C ++, как все, наверное, знают, допускает множественное наследование, в отличие от Java, которое допускает только простое наследование, и если мы хотим что-то похожее, мы должны использовать интерфейсы, в конце концов, он менее подвержен ошибкам.
Основной пример, который мы собираемся показать здесь, чтобы увидеть наследование в C ++, прост, мы не будем вдаваться в множественное наследование, кроме как в конце, чтобы показать ошибку, на которую мы можем повлиять.
1. Простое наследование в C ++
Чтобы начать первый пример, простое наследование, у нас будет класс Animal, который будет нашим базовым или родительским классом, и 2 класса, которые будут наследоваться, Dog, у которого не будет никакого кода, и Cat, который добавит новый параметр в родительский класс. Давайте посмотрим код (это короткий):
#include использование пространства имен std; Класс Animal {private: int age; public: Animal (int a = 1) {age = a; }; int getAge () const {return age;} void setAge (int a = 9) {age = a; }}; класс Dog: public Animal {}; класс Cat: public Animal {private: вес поплавка; public: Cat (int a = 2, float w = 3.2): Animal (a) {weight = w; } float getWeight () const {return weight;}}; int main () {Собака Мастин; cout << "____DOG____" << endl; cout << "Before:" << mastin.getAge () << endl; mastin.setAge (2); cout << "After:" << mastin.getAge () << endl; Кошачий мяу (3, 4, 1); cout << "____CAT____" << endl; cout << miau.getAge () << "" << miau.getWeight () << endl; }Мы считаем само собой разумеющимся, что вы уже знаете кое-что о C ++, чтобы видеть проблемы наследования, и поэтому открытая и закрытая части функций или сторон не будут объяснять это. Для наследования от класса у нас есть следующий синтаксис:
class daughter_class: public parent_classИтак, в нашем примере для создания класса Dog мы использовали:
класс собака: общественное животноеЭто указывает на то, что Dog наследует от Animal, все, что есть у класса Animal в его открытых или защищенных блоках, может быть использовано, однако, если мы используем приватный блок, мы получим ошибку. Ну, класс Dog пуст, поэтому у него нет особых трудностей.
Если мы перейдем к классу Cat, у нас будет то же объявление класса, что и раньше, кроме того, мы видим, что он добавляет новую переменную веса, эта переменная не имеет ни классов Animal, ни Dog . Здесь в конструкторе класса мы вызвали родительский конструктор класса, поэтому мы передаем данные для переменной age, а также заполняем переменную weight .
примечание
Вы можете видеть, что параметры, которые мы передаем функциям, могут иметь значение по умолчанию.
В основном мы создаем объект класса Dog, мы оставляем возраст по умолчанию и показываем его, затем используем функцию setAge, чтобы изменить возраст и показать его снова. Наконец, мы создаем объект класса Cat, и на этот раз мы не позволяем переменным иметь значение по умолчанию и передаем их при создании объекта, чтобы избежать их изменения, мы их показываем.
Если мы хотим запустить этот код на терминале Linux с g ++, мы делаем следующее:
g ++ -o test tesc.gccИ запустить его очень просто:
./testМы покажем захват с компиляцией и выполнением небольшого кода:
2. Множественное наследование в C ++
Чтобы увидеть опасность множественного наследования, оставим очень маленький код:
#include использование пространства имен std; class Animal {public: void walk () {cout << "Прогулка с животными" << endl; }}; class Mamifero {public: void walk () {cout << "Прогулка в Мамиферо" << endl; }}; класс Dog: общедоступный Animal, общедоступный Mamifero {}; int main () {Собака; dog.caminar (); }Мы видим, что Dog наследует от Animal и Mammal, и оба класса имеют одинаковую функцию ходьбы, если я использую обычную функцию, как в коде:
dog.caminar ()И мы компилируем, мы получаем следующую ошибку:
Чтобы решить эту проблему, мы можем использовать следующий синтаксис для вызова функции Animal :
dog.Animal :: walk ();или использовать класс Mamifero :
dog.Mamifero :: walk ();И, конечно же, лучшим решением будет не иметь 2 функции с одинаковым именем, если мы собираемся использовать множественное наследование, в этой программе очень легко дать решение, но в большой это может стать головной болью.
- 0
СТАТЬИ