Работа с наследованием в C ++

{title}

В этом уроке мы поговорим о наследовании в 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