一、继承的概念
继承是面向对象编程中的一个重要概念,它指的是一个类(子类)可以从另一个类(父类)继承属性和方法。子类继承父类的属性和方法后,可以直接使用这些属性和方法,同时也可以在子类中添加新的属性和方法,或者对父类的方法进行重写。继承的作用主要包括:
1、代码复用:通过继承,子类可以重用父类的代码,避免重复编写相同的代码,提高了代码的复用性和可维护性。
2、扩展功能:子类可以在继承父类的基础上,添加新的属性和方法,实现对父类功能的扩展。
3、多态性:继承是实现多态性的一种方式,通过父类引用指向子类对象,可以实现对不同子类对象的统一操作
二、继承公有操作
三种继承方式
公有继承(public inheritance)
私有继承(private inheritance)
保护继承(protected inheritance)
公有继承是应用更广泛的继承操作,它直接将父类的权限复制到子类中(不存在权限降级)。
注:在公有继承中,子类不可以访问父类的私有成员(private),只能通过父类提供的公有接口进行访问。
代码示例:父类为动物,子类分别是猫和狗,其中name(名字)和age(年龄)为复用项,color(颜色)为狗的扩展项,breed(品种)为猫的扩展项。
#include <iostream>
#include <string>using namespace std;class Animal{public:string name;int age;void eat(){cout<<"在吃饭"<<endl;}void sleep(){cout<<"在睡觉"<<endl;}
};class Dog:public Animal{public:string color;void lookhone(){cout<<name<<"在看家"<<endl;}//继承扩展void eat(){cout<<name<<"津津有味的啃着骨头"<<endl;}void sleep(){cout<<name<<"在狗窝里睡觉"<<endl;}
};class Cat:public Animal{public:string breed;//品种void catchMouse(){cout<<name<<"在抓老鼠"<<endl;}void eat(){cout<<name<<"卯着劲的吃着猫粮"<<endl;}void sleep(){cout<<name<<"在猫窝里呼呼大睡"<<endl;}
};
int main()
{//创建Dog对象Dog dog;dog.name = "旺财";dog.age = 2;dog.color = "土黄色";dog.eat();dog.sleep();dog.lookhone();//创建Cat对象Cat cat;cat.name = "喵喵";cat.age = 1;cat.breed = "橘猫";cout<<"猫名:"<<cat.name<<endl;cout<<"猫龄:"<<cat.age<<endl;cout<<"品种:"<<cat.breed<<endl;cat.eat();cat.catchMouse();cat.sleep();return 0;
}
运行结果:
旺财津津有味的啃着骨头
旺财在狗窝里睡觉
旺财在看家
猫名:喵喵
猫龄:1
品种:橘猫
喵喵卯着劲的吃着猫粮
喵喵在抓老鼠
喵喵在猫窝里呼呼大睡
三、继承私有操作
派生类继承基类的成员,但这些成员在派生类中的访问权限是私有的,外部无法直接访问。
派生类可以访问基类的公有成员和保护成员,但外部代码无法访问这些成员。
私有继承会造成继承的子类的成员变量降级为private,导致子类和其他类都不能直接使用。
代码示例:
#include <iostream>
#include <string>
using namespace std;class Father{public:int a;void fun1(){cout<<"父类的公共方法"<<endl;}protected:int b;void fun2(){cout<<"父类的受保护方法"<<endl;}private:int c;void fun3(){cout<<"父类的私有方法"<<endl;}
};class Son3:private Father{public:void fun(){a = 10;b = 20;// c = 30;报错,父类私有子类不能访问fun1();//private,权限降级fun2();// fun3();报错,父类私有子类不能访问}
};int main()
{Son3 s3;//s3.a=10; a在子类中已经降级为private//s3.b=20; b在子类中已经降级为private//s3.c=30; c本来就是privates3.fun();return 0;
}
运行结果:
父类的公共方法
父类的受保护方法
四、保护继承
在C++中,使用protected访问修饰符可以实现保护继承,被protected修饰的成员可以被派生类继承,但不能被外部访问。
代码示例:
#include <iostream>
#include <string>
using namespace std;class Father{public:int a;void fun1(){cout<<"父类的公共方法"<<endl;}protected:int b;void fun2(){cout<<"父类的受保护方法"<<endl;}private:int c;void fun3(){cout<<"父类的私有方法"<<endl;}
};class Son2:protected Father{public:void fun(){a = 10;b = 10;// c = 30;fun1();//protected,权限降级fun2();//fun3();}
};int main()
{Son2 s2;// s2.a = 10// s2.b = 10;// s3.c = 30;s2.fun();return 0;
}
运行结果:
父类的公共方法
父类的受保护方法