这是关于一个普通双非本科大一学生的C++的学习记录贴
在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料
那么开启正题
今天分享的是关于继承的知识点
1.继承的概念及定义
1.1继承的概念
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新的类叫做派生类。继承呈现了面向对象程序组设计的层次结构,体现了由简单到复杂的认识过程。以前我们接触到的复用都是函数复用,继承是类设计层次的复用
1.2继承的定义
1.2.1定义格式
我们来看下面的代码
class Person
{
public:
int _age;
};
class Student : public Person
{
public:
int _stuid;
};
这段代码中Student就是派生类(子类),public就是继承方式,Person就是基类(父类)
1.2.2继承关系和访问限定符
在学习封装时候我们了解到访问限定符有三种
public访问,protected访问,private访问
与此对应的,继承方式也有三种
public继承,protected访问,private访问
1.2.3继承父类成员访问方式的变化
以前我们说protected(保护)和private(私有)暂时没有区别,而在继承这里就体现出来了区别
在public继承下,子类中,父类的private成员是无法访问的,而protected成员是可以访问的
不同的继承方式与不同的访问限定符,会是子类对父类的访问不一样,下面我们给出规律
父类的private成员在子类中无论以任何方式继承都是无法访问的
对于其他的,我们有下面的公式
父类成员在子类中的访问方式 == Min(成员在父类中的访问限定符,继承方式)
(public < protected < private)
注意:
1. 使用关键字class时默认继承方式是private,使用struct时默认继承方式时public,不过最好显式给出继承方式
2.实际运用中一般都是public继承,几乎很少有其他两种继承出现,我们也不提倡(维护性不强)
2.父类和子类对象赋值转换
1.子类对象可以赋值给父类的对象 / 父类的指针 / 父类的引用。(我们叫切割或者切片)
2.父类对象不能赋值给子类对象
class Person
{
protected:
int _age = 10;
};
class Student : public Person
{
public:
int _stuid;
};
void Test1()
{
Student s;
// 1.子类对象可以赋值给父类的对象 / 父类的指针 / 父类的引用。
// (我们叫切割或者切片)
Person p = s;
Person* pp = &s;
Person& rp = s;
// 2.父类对象不能赋值给子类对象
s = p;(err)
}
3.继承中的作用域
1.在继承体系中父类和子类都有独自的作用域
2.父类和子类有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫做隐藏(也叫做重定义)
3.如果是成员函数的隐藏,只要是函数名相同就构成隐藏
4.实际中继承体系里,最好不要定义同名成员
class A
{
public:
void Func(int i = 10)
{
cout << "A::Func(int)" << endl;
}
void Func(char ch = 'a')
{
cout << "A::Func(char)" << endl;
}
};
class B : public A
{
public:
void Func(int i)
{
cout << "B::Func()" << endl;
}
};
void Test2()
{
A a;
B b;
a.Func(1);
a.Func('a');
b.Func(1);
}
上面的几个Func函数分别构成重构和隐藏
新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!