c++继承(三)多态
2017-04-06 18:21
127 查看
多态:从字面意思不难理解为多种状态
构成多态的两个必要条件
(1)虚函数的覆盖(重写) 子类与父类一模一样的函数,子类覆盖了父类的虚函数
(2)父类的指针或者引用指向对象
重写:作用域不同,函数名相同(析构函数特殊),参数相同,返回值相同
虚函数:类的成员函数前加virtual关键字(必须是类的成员函数),在类内声明为虚函数时加virtual,在类外实现时不需要加virtual
构造函数不能为虚函数。最好把父类的析构函数定义为虚函数。
下面是关于多态和虚函数的一个简单例子
继承体系同名成员函数的关系
1.重载:在同一作用域,函数名相同/参数不同,返回值可以不同
2.重写:不在同一作用域(分别在基类和派生类),函数名相同/参数相同/返回值相同(协变例外),基类函数必须含有关键字virtual;访问修饰符可以不同。
3.重定义:也叫隐藏,在不同作用域(分别在基类和派生类),函数名相同,在基类和派生类中只要不构成重写就是重定义。
*纯虚函数
在类的虚函数后面写上=0,成员函数就变成了纯虚函数。包含纯虚函数的类叫做抽象类(接口类),抽象类不能实例化出对象。纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。
例如:virtual void Buytickets()=0;
*友元与继承
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。
*继承和静态成员
基类定义了static成员,则整个继承体系里面只有这样一个成员。所有派生出来的子类都共享这个static成员。对这个static成员初始化时只能放在类外单独进行初始化。
构成多态的两个必要条件
(1)虚函数的覆盖(重写) 子类与父类一模一样的函数,子类覆盖了父类的虚函数
(2)父类的指针或者引用指向对象
重写:作用域不同,函数名相同(析构函数特殊),参数相同,返回值相同
虚函数:类的成员函数前加virtual关键字(必须是类的成员函数),在类内声明为虚函数时加virtual,在类外实现时不需要加virtual
构造函数不能为虚函数。最好把父类的析构函数定义为虚函数。
下面是关于多态和虚函数的一个简单例子
#include<iostream> using namespace std; class person { public: virtual void Buytickets() { cout << "买票" << endl; } protected: string _name; }; class student :public person { public: virtual void Buytickets() { cout << "买票-半票" << endl; } private: int _num; }; void Fun(person& p) { p.Buytickets(); } int main() { person p; student s; Fun(p); Fun(s); system("pause"); return 0; }
继承体系同名成员函数的关系
1.重载:在同一作用域,函数名相同/参数不同,返回值可以不同
2.重写:不在同一作用域(分别在基类和派生类),函数名相同/参数相同/返回值相同(协变例外),基类函数必须含有关键字virtual;访问修饰符可以不同。
3.重定义:也叫隐藏,在不同作用域(分别在基类和派生类),函数名相同,在基类和派生类中只要不构成重写就是重定义。
*纯虚函数
在类的虚函数后面写上=0,成员函数就变成了纯虚函数。包含纯虚函数的类叫做抽象类(接口类),抽象类不能实例化出对象。纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。
例如:virtual void Buytickets()=0;
*友元与继承
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。
*继承和静态成员
基类定义了static成员,则整个继承体系里面只有这样一个成员。所有派生出来的子类都共享这个static成员。对这个static成员初始化时只能放在类外单独进行初始化。
相关文章推荐
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- 深入剖析C++继承,多态以及隐藏(二)。(纯虚函数以及重写与隐藏)
- 继承和多态和虚函数——C++学习笔记二
- C++有关类、继承、多态、构造、析构、重载
- MSN上关于C++多重继承和多态的聊天记录
- c++中继承_多态
- 重读C++之一:封装、继承和多态
- C++中的多态和继承
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- c++ 多态,继承的代价
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- c++继承与多态
- C++的继承与多态demo
- C++智能指针与类继承多态
- C/C++一些知识4(重载与多态、虚继承)
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
- C++多重继承的多态 - Thunk
- sogou interview ==> C 实现 C++ 封装 继承 多态
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)