学习c++的第八天
学习内容:
- 理解继承的含义,能够定义和使用类的继承关系;
- 掌握派生类的声明与实现方法;
- 掌握类的构造函数的初始化列表与作用域分辨符的使用方法;
- 理解虚基类在类的继承层次中的作用;
遇到的问题:
继承和派生的相同与不同点。
解决的办法:
经浏览CSDN里的大神们写的关于继承、派生的文章后,弄懂了它们的区别。
心得体会:
类B继承类A:
- 基类A的private成员a不可直接访问,派生类B只能通过基类中的public函数去访问这个私有成员。
#include<iostream>
#include<string>
using namespace std;
class A {
private:
int a = 6;
public:
void AccessPrivateDataMember() {
cout << a << endl;
}
};
class B : public A {}; //B继承A里边的除构造、析构函数外的所有public、protected修饰的成员。虽然不能继承private修饰的成员,但B可通过继承A的public修饰的函数成员,来访问private修饰的成员。
int main() {
B b;
b.AccessPrivateDataMember(); //B的对象b访问A的private修饰的数据成员a;
system("pause");
return 0;
}
protected修饰符:
- 横向来看,和private一样,不能在类外被访问。即类A和类B同辈分,而且毫无瓜葛。
- 纵向来看,在类A的子嗣中,对于其派生类来说,protected和public成员的性质是相同的。类A 是类B的爹,类B的成员可访问类A中protected修饰的成员。
派生类的构成:
- 继承基类的成员。默认情况下,子类包含父类中除了构造函数、private修饰的成员之外的所有成员。
- 可覆盖(重载)父类的成员。
- 可添加新的成员。
继承与派生是同一个过程从不同的角度看:
- 继承的目的: 实现设计与代码的重用,充分利用原有的类
- 派生的目的: 当新的问题出现,原有程序无法解决,需要对原有程序进行改造。
单继承时子类的定义:
class A{};
class B : public A{}; //class 派生类名:继承方式 基类名{};
多继承时子类的定义:
class A1{};
class A2{};
class A3{};
class B : private A1,public A2,protected A3{};
//class 派生类名:继承方式1 基类名1, 继承方式2 基类名2,...... {};
- 继承方式
学习内容4的代码
#include<iostream>
#include<string>
using namespace std;
class Mammal {
public:
Mammal() {
cout << "Mammal类构造函数被调用!" << endl;
}
~Mammal() {
cout << "Mammal类析构函数被调用!" << endl;
}
};
class Dog : public Mammal {
private:
string color;
public:
Dog() {
cout << "Dog类构造函数被调用!" << endl;
}
~Dog() {
cout << "Dog类析构函数被调用!" << endl;
}
void Getcolor() {
cout << "请设置小狗的毛发颜色:";
cin >> color;
}
void Setcolor() {
cout << "小狗的毛发颜色被成功设置,为:" << color << endl;
}
};
int main() {
Dog dog;
dog.Getcolor();
dog.Setcolor();
system("pause");
return 0;
}
构造和析构的顺序是相反的。构造时,基类先构造,然后再派生类。析构时则反过来。先调用派生类的析构,再调用基类的析构。这符合资源栈的操作。先进后出,先申请的资源后释放。
本文有部分引用,来自:继承与派生