类的继承是 c++ 编程中常用的机制
如何书写一个派生类:
在写完一个基础的类定义后, 在定义派生类时只需要将派生类的类名后加上相应的
继承方式和相应的基类名即可.
但在派生类中需要重新定义自己的构造函数, 赋值函数, 复制构造函数并重载 == 运算符
构造函数一般有两种书写方式:
(1) 添加基类函数的构造函数
- RatePlayer::RatePlayer( unsigned int r , const & fn )
- const string & ln , bool ht ): TableTennisPlayer(fn,ln,ht)
- { rating = r ; }
(2) 使用成员初始化列表
- RatePlayer::RatePlayer( unsigned int r , const & fn )
- const string & ln , bool ht ): TableTennisPlayer(fn,ln,ht), rating(r)
ps: 在生成时, 首先生成基类, 后生成派生类; 在析构时, 首先析构派生类, 再析构基类 ;
复制构造函数与赋值函数的注意点:
c++ 默认的复制构造函数与赋值函数是浅复制, 不会分配内存, 所以一但涉及内存则需要自己
重新定义复制构造函数与赋值函数.
ps: 复制构造函数有着类型转换的功能, 包含显式与隐式两种, 但隐式往往是多余的,
所以一般需要添加 explict 声明来拒绝这种隐式的转换.
析构函数:
每次书写析构函数都应该在前加上 virtual 声明,
如若出现内存的动态分配, 则需要为析构函数添加内存处理的内容;
==============================
指针与虚函数
没有虚函数定义时:
使用基类的类指针指向派生类, 那么这个派生类所能使用的方法只能是基类的方法;
而使用派生类的指针指向基类是非法的;
相应的类使用相应的方法则调用的是自己对应的方法.
结论: 类对象所使用的方法完全取决于其指针的类型.
在有定义虚函数时:
则不会被指针的类型所约束, 类对象所使用的方法完全取决于类对象本身.
ps: 这在继承时非常重要, 特别是在定义析构函数时一定要定义为虚析构函数,
这样在处理内存上的问题时, 对象会调用自己相应的内存释放方法
关于虚函数本身:
虚函数常用来解决同一类的基类与其派生类中相同处理方法名的问题;
这样就可以在同一类的类类型中选择自己自身匹配的类类型方法;
同时注意 virtual 语句的声明只在这个类的定义中出现.
虚基类如若函数名相同, 而在类中的输入参数不同则在之后的派生类中, 先前的虚函数被覆盖.
==============================
不同的继承方式
private:
私有继承, 所有的继承的数据只有通过其基类本身的接口进行访问
只有其直系派生类才可以调用他的方法;
同外界没有直接联系.
protected:
保护继承, 只有在其派生类中才可以访问基类;
同外界没有直接联系.
public:
公有继承, 外界可以直接访问基类.
- class BaseEllipse
- {
- private:
- double x ;
- double y ;
- public:
- BaseEllipse( double x0 = 0 , double y0 = 0 ): x(x0) , y(y0) {}
- virtual ~BaseEllipse() {}
- void move( int nx , int ny ){ x = nx ; y = ny ; }
- virtual double area() const = 0 ; // 纯虚函数 , const 在函数后表明函数不改变调用它的对象的值
- }
来源: http://www.bubuko.com/infodetail-2668609.html