C++学习笔记13:类继承和派生、虚函数

来源:互联网 发布:dnf双开网络中断 编辑:程序博客网 时间:2024/06/05 15:06

1. 派生

派生类继承了基类的:

  • 派生类对象存储了基类的数据成员
  • 派生类对象可以使用基类的方法
派生类需要添加:
  • 自己的构造函数(必须为新成员和继承的成员提供数据)
  • 根据需求添加额外的数据成员和成员函数

2. 派生类构造函数

因为派生类不能直接访问基类的私有成员,所以要通过基类的构造函数初始化基类的私有成员。
有关派生类构造函数的要点:
  • 首先创建基类对象
  • 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
  • 派生类构造函数应初始化派生类新增的数据成员

3. 基类和派生类之间的特殊关系

  • 派生类可以使用基类的方法,条件是方法不是私有的
  • 基类指针和基类引用可以在不进行显示类型转换的情况下指向和引用派生类

4. 多态公有继承

实现多态公有继承的方法:
  • 在派生类中重新定义基类方法
  • 使用虚方法:方法声明中加关键字virtual(一般在基类方法声明和派生类方法声明中都加virtual关键字,但派生类方法声明中也可不加 )。如果方法是通过引用或者指针调用使的,如果用了virtual,程序将根据引用或指针指向的对象的类型来选择方法;如果没有用virtual,程序根据引用类型或者指针类型选择方法。virtual只用于类声明的方法原型中,而不需要用于方法定义中。

5. 虚析构函数

在类的继承和多态中,通常将析构函数设置为虚函数,这样可以确保正确的析构函数序列被调用。

6. 动态联编和静态联编

  • 函数名联编:将源代码中的函数调用解释为执行特定的函数代码块。
  • 静态联编:在编译过程中进行联编
  • 动态联编:在程序运行时进行联编,比如虚函数。和静态联编相比效率更低
  • 虚函数的工作原理:给每个对象添加一个隐藏成员,隐藏成员中保存了一个指向虚函数地址数组的指针

7. 有关虚函数的注意事项

  • 构造函数不能是虚函数
  • 析构函数应当是虚函数,比如如下代码,如果不将析构函数设置为虚函数,delete语句将调用~ Employee(),只释放由Singer对象中的Employee部分指向的内存
Employee * pe=new Singer;...delete pe;
  • 友元不能是虚函数
  • 如果基类声明被重载了,应该在派生类中重新定义所有的基类版本。如果只重新定义其中一个版本,则另外两个版本将被隐藏,派生类对象将无法使用它们。
class Quene{public:virtual void show(int a)const;virtual void show(double x)const;virtual void show()const;};class iQuene:public Quene{public:virtual void show(int a)const;virtual void show(double x)const;virtual void show()const;};

8. 访问控制protected

  • 在类外部,保护成员和私有成员的行为类似
  • 对于派生类,保护成员和公有成员的行为类似






原创粉丝点击