浅谈继承
来源:互联网 发布:如何启动mysql服务 编辑:程序博客网 时间:2024/06/05 22:32
继承的简单介绍:
继承机制是面向对象程序设计是代码可以服用的重要手段,它允许程序员在原有的基础上进行扩展,增加功能。通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而求还同时拥有旧的成员。【已经存在的用来派生新类的类为基类,又称为父类;由已经存在的类派生出来的新类称为派生类,又称为子类。】
在c++语言中,一个派生类可以由一个基类派生,这种继承称为单继承;也可以由多个基类派生,这种继承称为多继承。
继承的定义格式:
单继承:
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};
class DeriveClassName : acess-label BaseClassName
{
<派生类新定义成员>
};
多继承:
class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
{
<派生类新定义成员>
};
class DeriveClassName : acess-label BaseClassName1,acess-label BaseClassName2,......
{
<派生类新定义成员>
};
注意:
‘ class’的默认继承方式是私有继承,‘struct’的默认继承方式是公有继承。也就是说
class base1{};struct base2{};class Derive:base1,base2{};
Derive类将私有继承base1,公有继承base2。
相当于
class Derive:private base1,public base2{};
继承方式
继承方式有3种,分别是:公有继承(public),私有继承(private),保护继承(protected)。
公有继承
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍为私有,不能被这个派生类的子类所访问。
class B{public: int _pub;protected: int _pro;private: int _pri;};class D1 :public B{public: void printB() { cout << "_pub=" << _pub << endl; cout << "_pro=" << _pro << endl; cout << "_pri=" << _pri << endl; }};
(1)基类成员对其对象的可见性
公有成员可见,其他不可见。保护成员等同于私有成员。
class B{public:int _pub;protected:int _pro;private:int _pri;};void funtest(){B b;b._pub = 1b._pro = 2;b._pri = 3}int main(){funtest();return 0;}
(2)基类成员对派生类的可见性
公有成员和保护成员可见,私有成员不可见。保护成员等同于公有成员。
#include<iostream>using namespace std;class B{public: int _pub;protected: int _pro;private: int _pri;};class D1 :public B{public: void printB() { cout << "_pub=" << _pub << endl; cout << "_pro=" << _pro << endl; cout << "_pri=" << _pri << endl; }};int main(){ return 0;}
(3)基类成员对派生类对象可见性
公有成员可见,其他成员不可见。
class B{public:int _pub;protected:int _pro;private:int _pri;};class D1 :public B{public:int _d;};void funtest(){D1 d;d._pub = 1;d._pro = 2;d._pri = 3;}int main(){funtest();return 0;}
** 每个父类可用的成员对子类也可用,因为每个子类对象也是一个父类对象。
在公有继承时,派生类对象可以访问基类中公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。(注意:派生类的对象和派生类中得成员函数对基类的访问权限是不同的。)
私有继承
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
class B{public: int _pub;protected: int _pro;private: int _pri;};class D2 :protected B{public: void printB() { cout << "_pub=" << _pub << endl; cout << "_pro=" << _pro << endl; cout << "_pri=" << _pri << endl; }}
(1)基类成员对其对象的可见性:
公有成员可见,其他不可见。
(2)基类成员对派生类的可见性:
公有成员和保护成员可见,私有成员不可见。
(3)基类成员对派生类对象的可见性:
所有成员都不可见。
所以,私有继承时,基类成员只能由派生类中成员函数访问,并且无法再往下继承。
保护继承
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问。
class B{public: int _pub;protected: int _pro;private: int _pri;};class D2 :protected B{public: void printB() { cout << "_pub=" << _pub << endl; cout << "_pro=" << _pro << endl; cout << "_pri=" << _pri << endl; }};
保护继承与私有继承方式情况相同,二者的区别在于对派生类的成员而言,对基类成员的不同的可见性。
** 如果基类成员不想在类外直接被访问,但需要在派神类中能被访问,就定义为protected。(可见protected限定符是因为继承才出现的)。
(上述所说的可见性也就是可访问性。)
以下是三种不同的继承方式的基类特性和派生类的特性
publicprotectedprivate公有继承仍为public成员仍为protected成员不可见私有继承变为private成员变为private成员不可见保护继承变为protected成员变为protected成员不可见
publicprotectedprivate公有继承仍为public成员仍为protected成员不可见私有继承变为private成员变为private成员不可见保护继承变为protected成员变为protected成员不可见
继承方式引起的访问控制关系变化:
公有继承:基类的访问属性在子类的访问属性都不变
保护继承:基类的非私有成员都成为子类的保护成员
私有继承:基类的非私有成员都成为子类的私有成员
总结
1.无论哪种继承方式,在派生类内部都可以访问基类的公有成员和保护成员,基类的私有成员存在但不可见。
2. ‘ class’的默认继承方式是私有继承,‘struct’的默认继承方式是公有继承。
3.在继承关系里面,如果没有显示定义构造函数,拷贝构造函数,析构函数等类的默认六个成员函数,编译器会默认合成这六个成员函数。
**类的六个默认成员函数:构造函数,拷贝构造函数,析构函数,赋值操作符重载,取地址操作符重载,const修饰的取地址操作符重载
基类与派生类的关系
任何一个类都可以派生出新类,派生类也可以派生新类。
基类是对若干个派生类的抽象,而派生类是基类的具体化。基类是它的派生类的公共特征(或者说是基础部分),而派生类通过增加操作行为将抽象类变为某种具体的类型。
先定义一个基类,该基类中有些操作并未实现。然后定义派生类,实现基类中定义的操作。这时,派生类可以看成基类定义的延续。
在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合,派生类在添加数据成员和成员函数。
访问申明采用作用域"::",一般形式为:基类名::成员名
继承关系中构造函数及析构函数调用·执行顺序
#include<iostream>using namespace std;class B{public:B(){cout << "B::B()" << endl;};~B(){cout << "B::~B()" << endl;};public:int _pub;};class D :public B{public:D(){cout << "D::D()" << endl;};~D(){cout << "D::~D()" << endl;};};void test(){D d;} int main(){test();return 0;}
函数调用顺序:
D::D()
B::B()
D::~D()
B::~B()
函数体执行顺序:
相当于
0 0
- 浅谈继承
- 浅谈继承
- 浅谈继承和组合
- 浅谈继承窗体
- 浅谈C++继承方式
- 浅谈继承和组合
- 浅谈C++继承方式
- 浅谈-----继承机制
- 浅谈多重继承
- 浅谈多重继承
- 浅谈c++的继承
- java继承个人浅谈
- 浅谈JavaScript继承
- 浅谈菱形虚拟继承
- 浅谈JS继承(一)
- 浅谈JS继承(二)
- 浅谈JS继承(三)
- 浅谈C++继承
- Python进阶(三十八)-数据可视化の利用matplotlib 进行折线图,直方图和饼图的绘制
- 深入字节码操作:使用ASM和Javassist创建审核日志
- SQL优化之道
- 讨论时间复杂度
- (简单排序dfs)今年暑假不AC
- 浅谈继承
- Qt中进度条窗口
- 无插件清理WordPress数据库的方法
- REST Service 开发
- 1010. 一元多项式求导
- 数据仓库的相关概念
- 代理模式
- linux 安装redis时 报错jemalloc/jemalloc.h:没有那个文件或目录
- WAV格式文件学习