(33.2)派生类的构成

1.派生类的说明

  • (1) 用作基类的类必须是已定义的, 其原因是显而易见的: 每个派生类包含并且可以访问其基类的成员, 为了使用这些成员, 派生类必须知道它们是什么。
    这一规则说明不可能从类自身派生出一个类。
  • (2) 如果需要声明(但并不实现) 一个派生类, 则只需要声明类名即可。
    例如:
class Derived : public Base; //错误, 前向声明会导致编译错误

要先声明基类,再声明派生类
class Base;
class Derived; //正确
  • (3) 显然, 在一个派生类中, 其成员由两部分构成: 一部分是从基类继承得到的, 另一部分是自己定义的新成员, 所有这些成员仍然分为public(公有) 、 private(私有) 和protected(保护) 三种访问属性。
  • (4) 友元关系不能继承。
    一方面, 基类的友元对派生类的成员没有特殊访问权限。 另一方面, 如果基类被授予友元关系, 则只有基类具有特殊访问权限, 该基类的派生类不能访问授予友元关系的类。
  • (5) 如果基类定义了静态成员, 则整个继承层次中只有一个这样的成员。
    无论从基类派生出多少个派生类, 每个静态成员只有一个实例。
  • (6) 静态成员遵循常规访问控制: 如果静态成员在基类中为私有的, 则派生类不能访问它。
    如果该静态成员在基类是公有的, 则基类可以访问它, 派生类也可以访问它。
  • (7) 一般地, 可以使用作用域运算符(::),也可以使用对象成员引用运算符(. ) 或指针成员引用运算符(->) 访问静态成员。

2.派生类的构成

在这里插入图片描述

  • 实际编程中, 设计一个派生类包括4个方面的工作:
    (1) 从基类接收成员。
    ►除了构造函数和析构函数, 派生类会把基类全部的成员继承过来。
    这种继承是没有选择的, 不能选择接收其中一部分成员, 而舍弃另一部分成员。
    (2) 调整基类成员的访问。
    ►派生类接收基类成员是程序员不能选择的, 但是程序员可以对这些成员作出访问策略。
    (3) 修改基类成员
    可以在派生类中声明一个与基类成员同名的成员, 则派生类中的新成员会覆盖基类的同名成员, 就实现了修改基类成员功能的效果。
    (4) 在定义派生类时增加新的成员。
    一般还应当自己定义派生类的构造函数和析构函数。

  • eg:

#include <isotream>
using namespace std;
class Base//基类
{
	private:
		int b_number;
	public:
		Base(){}//基类不带参数的构造函数
		Base(int i) :b_number(i){}//基类带参数的构造函数
		int get_number()
		{
			return b_number;
		}
		void print()
		{
			cout<<b_number<<endl;
		}
};

class Derived:public Base//派生类
{
	private:
		int d_number;//派生类增加的数据成员
	public:
		Derived(int i, int j):Base(i), d_number(j) {};//派生类构造函数
		void print()/派生类增加的成员函数,屏蔽掉了基类的print函数
		{
			cout << get_number()<< " ";//派生类继承的成员函数
			cout << d_number <<endl;
		}
};

int main()
{
	Base a(2);//基类对象
	Derived b(3,4);//派生类对象
	cout << "a is";
	a.print();//基类的print
	cout << "b is ";
	b.print();//派生类的print
}

发布了510 篇原创文章 · 获赞 134 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/103951015