C++继承
一.继承的概念和定义
1.继承的概念

可以把一些类的共性提取出来单独封装成一个类,让这个类作为基类
其他类继承这个类作为派生类
比方说下面这个Student类,Teacher类和Person类:
继承之前:

继承之后:

可见继承的确就是类设计层次的复用
2.继承的基本语法
了解了继承的概念之后,下面我们来学习一下继承的基本语法
比方说父类是A,子类是B
那么子类就可以通过在类名后面加上: 继承方式来继承父类
class A
{
...}
class B : public A
{
...}
这里的继承方式分为public(公有继承),protected(保护继承),private(私有继承)
继承的父类的成员的属性也分为三种:public(公有成员),protected(保护成员),private(私有成员)
因此经过排列组合就可以组合出这9种情况:

3.继承的代码演示
下面我们来演示一下,就拿Student,Teacher,Person类为例

继承成功

二.基类和派生类对象赋值转换


下面我们来演示一下,看看到底能不能赋值转换呢?

可见,完全可以完成赋值转换
我们都知道,临时变量具有常性,因此对临时变量进行引用的话必须要加const.
而且发生类型转化时就会产生临时变量
就像是这样
double d=1.1;
int& ri=d;//此时没有加const就会报错,因为d是double类型,转换为int类型时会产生临时变量
而我们刚才的时候
//引用赋值
Person& rp = s;
在这里s对象是Student类型,引用赋值给rp对象时并没有任何报错或者报警,说明的确没有产生任何临时变量
也就是说基类和派生类对象进行赋值转换时是不会发生类型转换的
三.继承中的作用域
1.概念

不过不建议在子类中设计跟父类同名的成员,否则会让代码变得复杂
2.演示
下面我们来演示一下

3.经典题目
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A
{
public:
void fun(int i)
{
cout << "func(int i)->" << i << endl;
}
};
请问这两个fun函数是什么关系?
A:两个fun构成函数重载
B:两个fun构成隐藏关系
C:编译时报错
D:运行时报错
注意:函数重载要求在同一作用域
而且只要这两个函数的函数名相同,就会构成隐藏关系
因此答案是B,而不是A
下面这两种调用方法正确吗?
B b;
b.fun();
b.fun(1);
答案是:b.fun();不正确,因为子类的fun和父类的fun构成了隐藏关系
因此按照就近原则会先匹配子类的fun函数,而子类的fun函数要求传入一个参数,因此这种调用方法不正确,
而下面这种调用方法是正确的b.fun(1);
那么我就是想要调用父类的fun函数呢?
指定类域
b.A::fun();

四.派生类的默认成员函数


下面来演示一下
1.编译器默认生成的成员函数
编译器默认生成的成员函数会去调用父类相应的默认成员函数
//基类
class Person
{
public:
//构造
Person(const char* name="root")
:_name(name)
{
cout << "Person的构造函数调用" << endl;
}
//拷贝构造
Person(const Person& p)
:_name(p._name)
{
cout << "Person的拷贝构造函数调用" << endl;
}

最低0.47元/天 解锁文章
621

被折叠的 条评论
为什么被折叠?



