继承(一)

1.代码重用

    C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码,修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的类来创建新类,而不是重新创建它们。

2.继承

    (1)继承是使用已经编号的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。

    (2)新类成为派生类或子类,原有类称为基类或父类。

    (3)派生类是基类的具体化

    (4)派生类的声明语法为:

              class 派生类名 : 继承方式 基类名 {

                   派生类新增成员的声明;

               };

3.共有,私有,保护成员

    (1)在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问共有类型数据和函数。

    (2)在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。

    (3)在关键字protected后面声明,与private类似,其差别表现在继承与派生对派生类的影响不同。

4.共有,私有,保护继承

  

   

#include <iostream>

using namespace std;


class Base {
public:
	int x_;
protected:
	int y_;
private:   
	int z_;
};


class PublicInherit : public Base {
public:
	void Test() {
		x_ = 10;
		y_ = 20;
		//z_ = 30;
	}
private:
	int a_;
};
class PrivateInherit : private Base {
public:
	void Test() {
		x_ = 10;
		y_ = 20;
		//z_ = 30;
	}
private:
	int a_;
};
int main() {
	Base base;
	base.x_ = 10;
	//base.y_ = 20;	
	//base.z_ = 30;	
	
	PublicInherit pi;
	pi.x_ =10;
	//pi.y_ =20;
	//pi.z_ =30;
	PrivateInherit pr;
	//pr.x_ =10;
	//pr.y_ =20;
	//pr.z_ =30;
	return 0;
}

5.默认继承保护级别

   class Base {};

   struct D1 : Base {};  // 公有继承

    class D2 : Base {};  // 私有继承

6.接口继承与实现继承

    (1)我们将类的公有成员函数称为接口。

    (2)公有继承,基类的共有成员函数在派生类中任然是公有的,换句话说是基类的接口成为了派生类的接口,因而将它称为接口继承。

    (3)实现继承,对于私有,保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承

7.继承与重定义

    (1)对基类的数据成员重定义

    (2)对基类成员函数的重定义分为两种

              [1]overwrite(覆盖):与基类完全相同;与基类成员函数名相同,参数不同

              [2]override(重写):virtual

#include <iostream>
using namespace std;


class Base {
public:
	Base(): x_(0) {
	}
	int GetBaseX() const {
		return x_;
	}
	void Show() {
		cout << "Base::Show ..." << endl;
	}
public:
	int x_;
};

class Derived: public Base {
public:
	Derived(): x_(0) {
	}
	int GetDerivedX() const {
		return x_;
	}
	void Show() {
		cout << "Derived::Show ..." << endl;
	}
	void Show(int n) {
		cout << "Derived::Show(int n) ..." << endl;
	}
public:
	int x_;
};


class Test {
public:
	Base b_;
	int x_;
};


int main(void) {
	Derived d;
	d.x_ = 10; 
	d.Base::x_ = 20;
	cout << d.GetBaseX() << endl;
	cout << d.GetDerivedX() << endl;	
	d.Show();
	d.Base::Show();
	
	cout << sizeof(Derived) << endl;
	cout << sizeof(Test) << endl;
	
	return 0;
}

8.继承和组合

    (1)无论是继承与组合本质都是把子对象放在新类型中,两者都是使用构造函数的初始化列表去构造这些子对象。

    (2)组合是希望新类内部具有已存在的类的功能时使用,而不是希望已存在类作为它的接口。组合通过嵌入一个对象以实现新类的功能,而新类用户看到的是新定义的接口,而不是来自老类的接口。(has-a)

    (3)如果希望新类与已存在的类有相同的接口(在这基础上可以增加自己的成员)。这时候需要用继承,也称为子类型化。(is-a)

class A {
public:
        void FunA() {
                ...
        }
};

class B {
public:
        void FunB() {
                ...
                a_.FunA();
                ...
        }
private:
        A a_;
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值