以下是阿鲤对c++中继承学习的总结,希望对大家有所帮助;若有误请慷慨指出。
1:继承的概念及定义
2:基类和派生类切割和隐藏
3:继承与友元
4:继承与静态成员
5:派生类默认函数成员
一:继承的概念及定义:
1.1:继承的概念
继承的出现是为了增加面向对象程序语言的代码复用性;它允许程序员在原来的类(基类)上进行扩展、曾强功能,从而产生一个新的类(派生类);继承是类设计层次的复用。
eg:
using namespace std;
class BasicTest//基类
{
};
class Test:public BasicTest//派生类
{
};
int main()
{
return 0;
}
1.2:继承的定义
1.2.2:继承的格式:
1.2.3:继承关系和访问限定符
继承分为public继承,private继承,protected继承;
访问限定符分为public访问,private访问,prouected访问;(指基类中的成员权限)
所以继承方式和访问权限可组成九种访问模式,如下表
其实对于这张表的总结只需要一句话:权限取小
eg:
#include<iostream>
using namespace std;
class BasicTest
{
public:
int m_a;
private:
int m_b;
protected:
int m_c;
};
class Test : public BasicTest
{
public:
Test()
{
m_a = 3;
m_b = 4;
m_c = 5;
}
};
int main()
{
Test t;
t.m_a;
t.m_b;
t.m_c;
system("poause");
return 0;
}
由上面的例子我们便可看出,m_a是派生类中的public成员, m_b在派生类中不可访问, m_c是派生类中的private成员。
二:基类和派生类切割和隐藏
首先请看一个例子
eg:
#include<iostream>
using namespace std;
class BasicTest
{
public:
int m_a;
void fun()
{
cout << "father" << endl;
}
};
class Test : public BasicTest
{
public:
int m_a;
void fun(int a = 4)
{
cout << "sun" << endl;
}
};
如上面的例子,因为基类和派生类中都存在fun函数和变量m_a,所以在派生类中基类的fun函数和变量m_a均被隐藏,在类外使用派生类所实例化的对象是都针对的是派生类中的成员。那么是不是在派生类中不能访问到基类中的成员吗?
当然不是了,只需要加上作用域限定符::即可。如下
class Test : public BasicTest
{
public:
int m_a;
void fun(int a = 4)
{
BasicTest::m_a = 7;
cout << "sun" << endl;
}
};
当然还有其他的方式可以通过派生类访问基类的成员,那就是切割:
由类继承的定义我们不难看出派生类的范围是大于基类的范围的,所以我们看可以通过指针的强制转换由派生类访问基类,如下。
#include<iostream>
using namespace std;
class BasicTest
{
public:
int m_a;
void fun()
{
cout << "father" << endl;
}
};
class Test : public BasicTest
{
public:
int m_a;
void fun(int a = 4)
{
BasicTest::m_a = 7;
cout << "sun" << endl;
}
};
int main()
{
Test *pt = new Test;
BasicTest *bpt = (BasicTest *)pt;
bpt->fun();
system("pause");
return 0;
}
结果:打印father
注意:不能使用强制转化将基类转化成派生类,因为派生类的范围大于基类,所以派生类的空间大于基类;若使用强制转换便会出现内存越界的情况。
三:继承与友元
友元关系不能被继承:,也就是说基类友元不能访问子类私有和保护成员(可以这样理解,你爸爸的朋友不是你的朋友)。
四:继承与静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一 个static成员实例 。
eg:
#include<iostream>
using namespace std;
class test1
{
public:
static int m_a;
};
int test1::m_a = 8;
class test2 : public test1
{
};
class test3 : public test2
{
};
int main()
{
test3::m_a = 666;
cout << test1::m_a << endl;
system("pause");
return 0;
}
输出为666。
五:派生类默认函数成员
六大默认 | 功能 |
默认构造 | 初始化 |
拷贝构造 | 使用同类对象初始化 |
析构 | 清理 |
赋值运算符重载 | 把一个对象赋值给另一个对象 |
&运算符重载 | 取地址 |
const &运算符重载 | const取地址 |
在这里要重点说的是派生类中,构造和拷贝构造的顺序;
构造:先基类后派生类
析构:先派生类后基类
好了以上就是阿鲤对继承学习的全部总结啦。