您的位置:首页 > 编程语言 > C语言/C++

c++继承(三)多态

2017-04-06 18:21 127 查看
多态:从字面意思不难理解为多种状态

构成多态的两个必要条件

(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成员初始化时只能放在类外单独进行初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: