1. 语法
继承关系: A is a B
父类 / 子类
基类 / 派生类
继承语法:
class 派生类:public 基类 {
成员
}
三角形和等腰三角形之间的继承关系
#include <iostream>
#include <cmath>
using namespace std;
class Triangle{
int a,b,c;
public:
Triangle(int a,int b,int c):a(a),b(b),c(c){
} //初始化列表
int GetLength() const{
// int GetLength(const Triangle* this)
return a+b+c;
}
float GetArea() const{
float q = GetLength()/2.0;
return sqrt(q*(q-a)*(q-b)*(q-c)); //海伦公式
}
};
// A is a B
class IsoscelesTriangle:public Triangle{
public:
IsoscelesTriangle(int side,int iso):Triangle(side,iso,iso){
} // 直接使用父类的构造函数
};
int main(){
int a,b,c;
cin >> a >> b >> c;
Triangle t(a,b,c);
cout << t.GetLength() << " " << t.GetArea() << endl;
IsoscelesTriangle iso(a,b);
cout << iso.GetLength() << " " << iso.GetArea() << endl; // 直接使用父类的成员函数
}
结果为:
3 5 5
13 7.15454
13 7.15454
所以在使用父类的成员变量时,应该注意一些问题:
- 如果父类没有默认构造函数,子类初始化必须调用父类的构造函数
- 子类的构造函数初始化列表只能初始化自身的成员变量,不能直接初始化父类的成员变量
#include <iostream>
#include <cmath>
using namespace std;
class Triangle{
protected:
int a,b,c;
public:
Triangle():a(0),b(0),c(0){
}
Triangle(int a,int b,int c):a(a),b(b),c(c){
} //初始化列表
int GetLength() const{
// int GetLength(const Triangle* this)
return a+b+c;
}
float GetArea() const{
float q = GetLength()/2.0;
return sqrt(q*(q-a)*(q-b)*(q-c)); //海伦公式
}
};
// A is a B
class IsoscelesTriangle:public Triangle{
public:
// IsoscelesTriangle(int side,int iso):Triangle(side,iso,iso){} // 直接使用父类的构造函数
IsoscelesTriangle(int side,int iso){
a = side;
b = iso;
c = iso;
} // 使用父类的成员变量
};
int main(){
int a,b,c;
cin >> a >> b >> c;
Triangle t(a,b,c);
cout << t.GetLength() << " " << t.GetArea() << endl;
IsoscelesTriangle iso(a,b);
cout << iso.GetLength() << " " << iso.GetArea() << endl; // 直接使用父类的成员函数
// 查看类的大小判断子类是否继承了父类的成员变量
cout << sizeof(Triangle) << endl;
cout << sizeof(IsoscelesTriangle) << endl; // 子类继承父类所有的成员变量
}
结果为:
3 5 5
13 7.15454
13 7.15454
12
12
继承只是代表拥有,但不代表能访问
子类在访问父类成员函数时会涉及到权限的问题
protected 保护:对继承的子类可以访问,不允许外界访问,权限在public和prive之间
2. 成员的访问权限
使用程序测试可用权限
#include <iostream>
using namespace std;
class Base{
public:
void public_func(){
cout << __func__ << endl;
}
protected:
void protected_func(){
cout << __func__ << endl;
}
private:
void private_func(){
cout << __func__ << endl;
}
public:
void test(){
//类内成员函数可以访问所有成员函数
public_func();
protected_func();
private_func();
}
};
class Derive:public Base{
public:
void func(){
/* 对于public继承,子类内部可以访问父类的public和protected的成员 */
public_func();
protected_func();
// private_func();
}
};
int main(){
Base b;
b.