多态性
一、多态性概念
1.实现方法:
函数重载/运算符重载
虚函数
2.运算符重载
1)规则和限制
【.类属关系/*指针/::作用域分辨/?:三目/sizeof】不能重载
只能重载C++已有运算符
不改变运算符优先级、结合性、操作数个数
经过重载,操作数至少一个是自定义(class/struct)
2)形式
a)重载为类成员函数
参数个数=原操作数个数-1
b)重载为友元函数
参数个数=原操作数个数
3)运算符成员函数设计
a)二元运算符
a+b == A::operator+(Type b)
b)前置一元运算符
-a == a.A::operator-()
++a == a.A::operator++()
c)后置一元运算符
#有一个整型参数,但未用(形参列表加Int)
a-- == a.A::operator–(0)
4)运算符友元函数
a+b == operator+(a,b)
++a == operator++(a)
a++ == operator++(a,0)
二、类型兼容
class CB0//基类
{
public:
void display(){...}
void func_b0(){...}
}
class CB1 : public CB0//派生类
{
public:
void display(){...}
void func_b1(){...}
}
class CD : public CB1//派生类
{
public:
void display(){...}
void func_d(){...}
}
三、 虚函数
1.虚函数
//work()定义为虚成员函数
Student a;
Programer b;
Human *p;
p = &a;
a.work();
p->work();
p = &b;
b.work();
p->work;
2.虚成员函数
非静态的成员函数
virtual声明
派生类可以对基类虚函数重写,而不是重载
class MobilePhone : public Phone()
{
public:
virtual int dial(int number);
virtual int hangup();
...
};
int MobilePhone :: dial(int number)
{
...
}
int MobilePhone : hangup()
{
...
}
3.静态联编和动态联编
1)先前联编/静态
编译时确定调用特定类的特定方法
2)迟后联编/动态
运行时动态确定哪一个类被调用
4.指向父类的指针
1)派生类指针和基类指针值相等,用这两个指针调用基类的虚方法等价
2)多重继承
class student
{
};
class programmer
{
};
class student_programmer:
public student,pubilc programmer
{
};
3)虚析构函数
通过基类指针删除派生类的对象时
允许他人通过基类指针调用对象的析构函数
5.抽象类
1)抽象类
带有纯虚函数的类叫抽象类
2)纯虚函数
基类中说明的,未定义具体内容,派生自定义
class 类名
{
virtual 类型 函数名(参数表)=0;
//纯虚函数,只定义方法调用的格式
。。。
}
...
class B0//抽象基类B0声明
{
public://外部接口
virtual void display() = 0;//纯虚函数成员
};
class B1 : public B0//派生类
{
public:
void display(){cout<<"B1::display()"<<endl;}//虚成员函数
};
class D1 : public B1//派生类
{
public:
void display(){cout<<"D1::display()"<<endl;}//虚成员函数
};