一、继承的概念
继承是面向对象编程中的一个重要概念,它指的是一个类(子类)可以从另一个类(父类)继承属性和方法。子类继承父类的属性和方法后,可以直接使用这些属性和方法,同时也可以在子类中添加新的属性和方法,或者对父类的方法进行重写。继承的作用主要包括:
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本来就是private
s3.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;
}
运行结果:
父类的公共方法
父类的受保护方法