一、何为基类,何为派生类
从一个类中派生出另一个类,原始类被称为基类,继承类成为派生类,子继承父,父为基类,子为派生类,则要实现继承,首先要出现基类即父类。
二、继承关系又是如何即访问权限
- - - -public继承基类的属性在派生类中是没有变换的,protect继承基类中的属性public属性变成protect属性(private仍为private),private继承基类中public、protect属性全变为private属性,注意在派生类中是可以访问protect属性的基类成员,private不可使用并非没有继承,其成员变量在派生类仍占一定的内存空间。- - - -
在实际中的一般继承都为public继承。
三、派生类、基类中常见调用关系
<1> 在实现派生类的构造时需要用到基类的构造,作为跳板,会跳到基类中的构造函数中对基类成员进行成员操作。
<2> 不只是对于构造函数,对于其它函数也是一样,因为派生类继承了基类(成员变量,成员函数),在派生类中调用基类的函数,使之在基类中成员变量被赋值等。
四、虚析构函数
今天刚讲虚析构函数,顺带复习下。
我们知道,析构函数是在一个变量、对象等在即将消亡时释放所对应的内存即会调用一次析构函数,如果你未写,系统会默认析构函数,而虚析构函数具有两个特点:
1. 覆盖效应
2. 推迟 (比较耗时) + 继承
作用: 析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。
有一幅图(便于理解):
g’()为虚析构,则其子类相同的类型的函数时都会调用vitrual g() … 此时在基类中g()会被覆盖则其说有对应的覆盖效应,但只适用于成员函数,不适用于成员变量。
四、虚析构函数
人比较懒,最后贴一份p112-p114的代码吧!(亲手验证)
#include <iostream.h>
class Ball
{
public:
int i;
void f()
{
cout <<"Ball::f()被调用!"<<endl;
}
void f(float x)
{
cout <<"Ball::f(float)被调用!传入的x值是 "<<x<<endl;
}
virtual void g(float x)
{
cout <<"Ball::g(float)被调用!传入的x值是 "<<x<<endl;
}
void g(double x)
{
cout <<"Ball::g(double)函数被调用!传入的x值是 "<<x<<endl;
}
Ball(int x): i(x)
{
cout <<"Ball基类的构造函数被调用!"<<"i="<<i<<endl;
}
virtual ~Ball()
{
cout<<"Ball基类的虚析构函数,注意它负责销毁i的内存!"<<endl;
}
};
class FootBall : public Ball
{
public:
int j;
void f()
{
cout <<"FootBall::f()被调用!"<<endl;
Ball::f(); //被隐藏的基类f可以这样被调用
}
void f(int x)
{
cout <<"FootBall::f(int)被调用!传入的x值是 "<<x<<endl;
}
void g(int x)
{
cout <<"FootBall::g(int)函数被调用!传入的x值是 "<<x<<endl;
}
void g(float x)
{
cout <<"FootBall::g(float)函数被调用!传入的x值是 "<<x<<endl;
}
FootBall(int x,int y):Ball(x),j(y)
{
cout<<"FootBall派生类构造函数被调用!"<<"i="<<i<<",j="<<j<<endl;
}
~FootBall()
{
cout<<"FootBall派生类覆盖改写的虚析构,注意它负责销毁j的内存!"<<endl;
}
};
void main()
{
FootBall *FootBallptr=new FootBall(5,6);
Ball &Ballref=*FootBallptr,*Ballptr;
Ballptr=FootBallptr;
Ballptr->f();
Ballref.f();
Ballptr->f(int(5));
Ballref.f(int(5));
cout<<endl;
Ballptr->g(float(1.5));
// Ballptr->g(int(1.5));
Ballptr->g(double(1.5));
cout<<endl;
Ballref.g(float(1.5));
// Ballref.g(int(1.5));
Ballref.g(double(1.5));
cout<<endl;
FootBallptr->f();
FootBallptr->f(float(1.5));
cout<<endl;
FootBallptr->g(int(1.5));
FootBallptr->g(float(1.5));
cout<<endl;
delete Ballptr;
}
各位晚安!