CPP-Inheritance
2015-10-10 05:24
288 查看
Derived Classes
如果已经有一个一般的类,现在要基于此类建立另外一个类。此时就要用到类的继承。例如,现在已经有个类employee, 想建立一个manager类。manager是特殊的employee. 可以用继承机制来建立。
: 表示了继承。
在Manager类中,只需要指定新的成员函数和数据成员。Employee类中所有的成员函数和数据成员都将被Manager自动继承。此例子中,Employee是基类(base class)。Manager是导出类(derived class).
类person,有得到和改变名字的成员函数,成员函数定义如下:
如果我们想描述一个雇员,可以定义一个新类:
Person写在冒号后面,暗示新类Employee是Person类的亚类(subclass).
成员函数earns和change_salary定义:
导出类继承了基类所有的数据成员。这意味着Employee的对象将包含数据成员name和salary. 注意基类不能用导出类里面新添加的成员函数。如Person的对象无法使用change_salary()和earns()两个成员函数。
导出类里面可以使用和基类同名的成员函数,其结果是得到一个新的成员函数,基类的成员函数被屏蔽掉。例如,如果我们也在类Employee中声明一个数据成员name,则类Employee中则有两个成员函数叫name,但第一个将被第二个隐藏。
上例子中,我们也在类Employee中中声明了一个和基类Person中同名的成员函数write_info().这将隐藏在Person中定义的成员函数。如果我们写e.write_info(),由于e是类Employee的一个对象,则在类Employee中定义的write_info()将被调用。但是如果我们写成p.write_info().则类Person中定义的成员函数write_info()将被调用。
类Employee中的成员函数write_info()可以写成:
第三行显示了我们该怎样访问一个隐藏的成员。
在使用继承类时,必须避免函数重载。如果一个函数在导出类中声明,所有在基类中的同名函数将被隐藏,而不管他们到底有什么参数。
有一些函数不能被继承:1) constructor 2) destructors 3) friend functions 4)assignment operator=.
assignment operator不能被继承是因为每个类都自动定义一个,因此基类的assignment operator被隐藏了。
导出类也可以有subclass. 因此,我们可以定义一个Programmer,它是Employee的subclass:
数据成员fav暗示程序员最喜欢的编程语言。类Employee是直接的基类,因为它写在programmer的定义中。类person是间接基类。类programmer的对象将继承它所有基类的属性。这意味着programmer有三个数据成员:name, salary, fav. 成员函数也可以被继承,因此,下列语句正确:
注意:最后一行中,Employee中的成员函数write_info()将被调用,因为它是programmer的直接基类。
一个基类可以导出许多彼此独立的类。例如,我们可以定义一个类定义临时雇员:
如果已经有一个一般的类,现在要基于此类建立另外一个类。此时就要用到类的继承。例如,现在已经有个类employee, 想建立一个manager类。manager是特殊的employee. 可以用继承机制来建立。
class Manager : public Employee { public: new member functions private: new data members
: 表示了继承。
在Manager类中,只需要指定新的成员函数和数据成员。Employee类中所有的成员函数和数据成员都将被Manager自动继承。此例子中,Employee是基类(base class)。Manager是导出类(derived class).
class Person{ public: const string& is_called() const; void change_name(const string& n); void write_info() const; private: string name; };
类person,有得到和改变名字的成员函数,成员函数定义如下:
const string& Person::is_called() const { return name;} void Person::change_name(const string& n) { name = n;} void Person::write_info() const { cout<<"Name: "<<name<<endl;}
如果我们想描述一个雇员,可以定义一个新类:
calss Employee : public Person{ public: Employee():salary(0) {}; long int earns() const; void change_salary(long int new_salary); void write_info()const; private: long int salary; };
Person写在冒号后面,暗示新类Employee是Person类的亚类(subclass).
成员函数earns和change_salary定义:
long int Employee::earns() const { return salary;} void Employee::change_salary(long int new_salary) {salary=new_salary;}
导出类继承了基类所有的数据成员。这意味着Employee的对象将包含数据成员name和salary. 注意基类不能用导出类里面新添加的成员函数。如Person的对象无法使用change_salary()和earns()两个成员函数。
导出类里面可以使用和基类同名的成员函数,其结果是得到一个新的成员函数,基类的成员函数被屏蔽掉。例如,如果我们也在类Employee中声明一个数据成员name,则类Employee中则有两个成员函数叫name,但第一个将被第二个隐藏。
上例子中,我们也在类Employee中中声明了一个和基类Person中同名的成员函数write_info().这将隐藏在Person中定义的成员函数。如果我们写e.write_info(),由于e是类Employee的一个对象,则在类Employee中定义的write_info()将被调用。但是如果我们写成p.write_info().则类Person中定义的成员函数write_info()将被调用。
类Employee中的成员函数write_info()可以写成:
void Employee::write_info() const { Person::write_info(); cout << "Salary: " << salary << endl; }
第三行显示了我们该怎样访问一个隐藏的成员。
在使用继承类时,必须避免函数重载。如果一个函数在导出类中声明,所有在基类中的同名函数将被隐藏,而不管他们到底有什么参数。
有一些函数不能被继承:1) constructor 2) destructors 3) friend functions 4)assignment operator=.
assignment operator不能被继承是因为每个类都自动定义一个,因此基类的assignment operator被隐藏了。
导出类也可以有subclass. 因此,我们可以定义一个Programmer,它是Employee的subclass:
class Programmer : public Employee{ public: const string& read_favorite() const {return fav;} void change_favorite(const string& f){fav=f} private: string fav; };
数据成员fav暗示程序员最喜欢的编程语言。类Employee是直接的基类,因为它写在programmer的定义中。类person是间接基类。类programmer的对象将继承它所有基类的属性。这意味着programmer有三个数据成员:name, salary, fav. 成员函数也可以被继承,因此,下列语句正确:
Programmer pr; pr.change_name("Shae"); pr.change_salary(500000); pr.change_favorite("C++"); pr.write_info(); //Employee中的write_info()将被调用
注意:最后一行中,Employee中的成员函数write_info()将被调用,因为它是programmer的直接基类。
一个基类可以导出许多彼此独立的类。例如,我们可以定义一个类定义临时雇员:
class Tem_emp : public Emploee{ public : Date from, to; }; class Date{ public: int year,mon,day; };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android Native 绘图方法
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- PostgreSQL教程(三):表的继承和分区表详解
- C#中struct和class的区别详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua教程(一):在C++中嵌入Lua脚本
- 浅析Ruby中继承和消息的相关知识
- Lua教程(二):C++和Lua相互传递数据示例
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析