C++讲义 第8章 继承与派生

《C++程序设计》教学讲义8章


第8章 继承与派生

§8.1 继承与派生的基本概念

§8.2 派生类的定义
一般语法:
class 派生类名:继承方式 基类名1,继承方式 基类名2,...,继承方式 基类名n
{
派生类成员声明;
}
§8.3 派生类过程
1、吸收基类成员
2、改造基类成员——重载、覆盖
3、添加新成员——数据、方法

§8.4 访问控制——继承特性表
————————————————————
继承方式 基类特性   派生类特性
————————————————————
公有继承 public   public
protected   protected
private   不可访问
————————————————————
私有继承 public   private
protected   private
private   不可访问
————————————————————
保护继承 public   protected
   protected   protected
private   不可访问
————————————————————

§8.5 派生类的构造函数与析构函数
一、构造函数
1、构造函数不能被继承
2、成员初始化列表
3、派生类构造函数调用顺序
(1)基类构造函数
(2)子对象构造函数(如果有的话)
(3)派生类构造函数
二、析构函数
1、析构函数不能被继承
2、派生类析构函数调用顺序
(1)派生类析构函数
(2)子对象析构函数(如果有的话)
(3)基类析构函数
三、例题
#include <iostream>
using namespace std;

class A
{
public:
A(int a);
~A();
void Show();
private:
int m_a;
};

A::A(int a)
{
m_a = a;
cout<<"A 构造函数被调用。"<<endl;
}
A::~A()
{
cout<<"A 析构函数被调用。"<<endl;
}

void A::Show()
{
cout<<"m_a = "<<m_a<<endl;
}

class B:public A
{
public:
B(int a, int b);
~B();
void Show();
private:
int m_b;
};

B::B(int a, int b):A(a)
{
m_b = b;
cout<<"B 构造函数被调用。"<<endl;
}

B::~B()
{
cout<<"B 析构函数被调用。"<<endl;
}

void B::Show()
{
cout<<"m_b = "<<m_b<<endl;
}

int main()
{
A a(5);
a.Show();
B b(1,2);
b.Show();
return 0;
}
§8.6 二义性问题
一、产生原因
多继承中,基类中有同名函数
情况1:
A Fun() B Fun()
\          /
    \      /
      \ /
       C
情况2:
        A Fun()
      /   \ 
    /       \
/           \
B1 B2 产生两个Fun()
\           /
    \       /
      \   /
        C
二、解决方法
采用限定符
例如:a.A::Fun();

§8.7 虚基类
     A Fun()
      /   \ 
virtual virtual
/           \
B1 B2 产生一个Fun()
\           /
    \       /
      \   /
        C

§8.8 兼容性规则
类型兼容性规则是指在需要基类对象的任何地方,
都可以使用共有派生类的对象来替代。
在替代之后,派生类的对象就可以作为基类的对象使用,
但只能使用从基类继承的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值