目录
1. 关于继承
创建一个基类(又称超类),基类包含通用属性,其派生类(又称子类)覆盖其他基本功能。以下是一个共有继承的代码1.1:
#include<iostream>
using namespace std;
class Fish
{
public:
bool isFreshWaterFish;
void Swim()
{
if(isFreshWaterFish)
{cout<<"Swim in lake"<<endl;}
else
{cout<<"Swim in sea"<<endl;}
}
};
class Tuna: public Fish
{
public:
Tuna(/* args */);
};
Tuna::Tuna(/* args */)
{
isFreshWaterFish = true;
}
class Carp: public Fish
{
public:
Carp(/* args */);
};
Carp::Carp(/* args */)
{
isFreshWaterFish = false;
}
int main()
{
Carp myCarp;
Tuna myTuna;
cout<<"myCarp is ";
myCarp.Swim();
cout<<"myTuna is ";
myTuna.Swim();
return 0;
}
1.1 访问限定符protected
将类的属性声明为protected时,相当于允许派生类和友元类访问它,但禁止在继承层次结构外部(包括main())中访问它。例如可以将以上代码的isFreshWaterFish属性改为protected,这样确保了类的安全性。
1.2 基类初始化——向基类传递参数
如果基类包含重载构造函数,需要在实例化时给它提供实参,那么创建派生类时可以通过初始化列表,以及在派生类的构造函数调用合适的基类构造函数,从而实现基类的初始化。
以下代码1.2是在代码1.1的基础上进行修改:
class Fish
{
private:
bool isFreshWaterFish;
public:
Fish(bool isFreshWater): isFreshWaterFish(isFreshWater){}
/*Fish(bool isFreshWater)
{
isFreshWaterFish = isFreshWater;
}这样也可以*/
void Swim()
{
if(isFreshWaterFish)
{cout<<"Swim in lake"<<endl;}
else
{cout<<"Swim in sea"<<endl;}
}
};
class Tuna: public Fish
{
public:
Tuna():Fish(false){}//初始化基类
};
class Carp: public Fish
{
public:
Carp():Fish(true){}//初始化基类
};
1.3 在派生类中覆盖基类的方法
意思就是在派生类中重写了基类中的方法从而实现对基类原方法的覆盖。以下代码1.3是在1.2的基础上进行修改:
class Tuna: public Fish
{
public:
Tuna():Fish(false){}//初始化基类
void Swim()
{
cout<<"Tuna can swim very fast."<<endl;
}
};
这样在main函数中调用Tuna::Swim会调用Tuna类中的这个Swim()而不是Fish基类中的Swim()。
如果想要调用基类中被覆盖的方法,需要使用作用域解析运算符:
myTuna.Fish::Swim();
1.4 构造和析构顺序
基类对象在派生类对象之前被实例化,即先构造基类,再构造派生类;析构顺序则相反,先析构派生类,最后析构基类。
2. 私有继承和保护继承
私有继承意味着在派生类的实例中,基类的所有公有成员和方法都是私有的——不能从外部访问。
私有继承的关键字是private。
保护继承也让派生类能够访问基类的所有公有和保护成员,且在继承层次结构外不能通过派生类实例访问基类的共有成员。
保护继承与私有继承的区别是:在保护继承层次结构中,子类的子类能够访问基类的共有成员和保护成员,私有继承则不可。(保护继承比较像是家族继承,私有继承比较像母女父女继承)
保护继承的关键字是protected。
P219/204
3. 多继承
顾名思义就是一个子类继承了多个基类。
语法如下:
class Platpus: pubic Mammal, public Reptile, Public Bird
{
//balabala
}
4. 使用final禁止继承
被final声明的类不可以作为基类,语法如下:
class Platpus final: pubic Mammal, public Reptile, Public Bird
{
//balabala
}
注:无论继承关系如何,类的私有成员都不能在类外访问,除了类的友元函数和友元类。
题目记录:编写一个Circle类,它根据实例化时提供的半径计算面积和周长。将Pi包含在一个私有成员常量中,该常量不能在类外访问。
Circle(double InputRadius): radius(InputRadius), Pi(3.1416){}