学习网站:C语言网.
C语言基础:C语言基础.
笔记及源码gitee地址:C++基础笔记及源码.
编译器:Red Panda Dev-C++.
1.继承和派生
// 1.继承:有两个类,新类拥有原有类的全部属性叫做继承;
// 2.派生:原有类产生新类的过程叫做派生;
// 3.父类(基类):原有的类;派生类(子类):由基类派生出来的类;
#include <iostream>
using namespace std;
// Clock基类;
class Clock {
private:
int H;
int M;
int S;
public:
int SetTime(int h,int m,int s){
this->H = h;
this->M = m;
this->S = s;
return 0;
}
int ShowTime(){
cout << "Now:" << H << ":" << M << ":" << S << endl;
return 0;
}
};
// AlarmClock派生类;
class AlarmClock:public Clock { // 冒号:表示继承,public表示公有继承、私有继承、保护继承
private:
int AH;
int AM;
public:
int SetAlarm(int AH,int AM){
this->AH = AH;
this->AM = AM;
return 0;
}
int ShowAlarm(){
cout << "AlarmTime:" << AH << ":" << AM << endl;
return 0;
}
};
int main(){
AlarmClock A;
A.SetTime(19,15,50);
A.ShowTime();
A.SetAlarm(5,30);
A.ShowAlarm();
return 0;
}
2.三种继承方式
// 公有继承、私有继承、保护继承;
// 1.公有继承
// 1.1 基类中的公有成员,在派生类中仍然为公有成员;无论派生类的成员函数还是派生类对象都可以访问;
// 1.2 基类中的私有成员,在派生类的成员还是派生类对象都不可以访问;
// 1.3 基类中的保护成员,在派生类中仍然是保护类型,可以通过派生类的成员函数访问,但派生类对象不可以访问;
// 2.私有继承
// 2.1 基类的公有和受保护类型,被派生类私有继承后,都变为派生类的私有类型,即在类的成员函数里可以访问,不能在类外访问;
// 2.2 基类的私有成员,在派生类型无论类内还是类外都不可以访问;
// 3.保护继承
// 3.1 基类的公有成员和保护类型成员在派生类中为保护成员;
// 3.2 基类的私有成员在派生类中不能被直接访问;
3.派生类的构造函数
// 1.派生类会吸纳基类的全部成员,但不包括构造函数及析构函数;
// 2.创建派生类在调用自己的构造函数前,会先调用基类的构造函数;
#include <iostream>
using namespace std;
class Clock {
private:
int H;
int M;
int S;
public:
Clock(){
cout << "Clock's Constructor Called!" << endl;
}
};
class AlarmClock:public Clock {
private:
int AH;
int AM;
public:
AlarmClock(){
cout << "AlarmClock's Constructor Called!" << endl;
}
};
int main(){
AlarmClock A;
return 0;
}
// 调用带参数的基类构造函数;
// 格式:派生类构造函数名 (总形参表列) : 基类构造函数 (实参表列)
#include <iostream>
using namespace std;
class Clock {
private:
int H;
int M;
int S;
public:
Clock(){
cout << "Clock's Constructor Called!" << endl;
}
Clock(int h,int m,int s){
this->H = h;
this->M = m;
this->S = s;
cout << "Clock's Constructor with parameter Called!" << endl;
}
};
class AlarmClock:public Clock {
private:
int AH;
int AM;
public:
AlarmClock(){
cout << "AlarmClock's Constructor Called!" << endl;
}
AlarmClock(int h,int m,int s):Clock(h,m,s){
cout << "AlarmClock's Constructor with parameter Called!" << endl;
}
};
int main(){
AlarmClock A(8,10,30);
AlarmClock B;
return 0;
}
4.派生类的析构函数
// 1.构造函数调用顺序:基类-->派生类;
// 2.析构函数调用顺序:派生类-->基类;
#include <iostream>
using namespace std;
class Clock {
private:
int H;
int M;
int S;
public:
Clock(){
cout << "Clock's Constructor Called!" << endl;
}
~Clock(){
cout << "Clock's Destructor Called!" << endl;
}
};
class AlarmClock:public Clock {
private:
int AH;
int AM;
public:
AlarmClock(){
cout << "AlarmClock's Constructor Called!" << endl;
}
~AlarmClock(){
cout << "AlarmClock's Destructor Called!" << endl;
}
};
int main(){
AlarmClock A;
return 0;
}
5.虚基类及虚基类的定义使用
/*
背景叙述:
在多继承关系中,如果一个派生来的从两个父类继承,这两个父类是从一个基类继承,
即这个派生类可能继承了两份一样的成员;
虚基类:在继承的时候在继承类型public前用virtual修饰,这个时候,派生类和基类只维护一份一个基类对象,避免多次拷贝,出现歧义;
*/
#include <iostream>
using namespace std;
class Grandfather {
public:
int key;
public:
};
// 虚基类定义:
// class Father1:virtual public Grandfather
class Father1:public Grandfather {
};
// 虚基类定义:
// class Father2:virtual public Grandfather
class Father2:public Grandfather {
};
// Grandson类继承了两个Father类,有两个key成员;
// 会造成二义性问题;
class Grandson:public Father1,public Father2 {
};
int main(){
Grandson A;
return 0;
}