多态的语法

多态作为面向对象的三大特性之一,它主要表现是利用父类的指针引用,可以指向子类的函数,实现父类指针的多种形态,既能指向父类,亦可指向子类,这是一种泛型技术,是为了用尽量少的代码逻辑,来实现多的场景应用,模板技术也是如此。今天我们来说说,多态的一些事。

我们用生活中的实例来解释一下多态的应用,比如你要买票,那么普通人一个价,学生票一个价,那么同样是买票这个行为,不同的人做有不同的效果,多态就是为了,让不同的类做同一个事,但是产生的效果却不同,在实现方面就是,调用了同一个函数,即做了同一个事,但是实现方式不同,即产生的效果不同。
那这里便产生了一个问题,为什么要多态呢,用两个函数不就行了吗?诚然,函数的实现本来就是函数代码复杂性的大头,我们既然已经选择了实现,为何还要弄个多态呢?
那是因为多态是在具有联系的父子类情形下才产生的,既然已经具有了联系,为何要分开它们的函数呢?而且因为在不同的作用域中,是不能构成重载的,所以更加需要多态的产生。

因此多态产生的条件是,第一通过基类的指针或者引用访问虚函数,二则是调用的必须是虚函数且,子类对父类的虚函数进行了重写。

虚函数是成员函数前面加了virtual关键字。

虚函数的重写:子类中有一个和父类完全相同的虚函数,即返回值,函数名,参数列表相同,则称子类对父类函数进行重写。

满足了多态,那函数的调用是跟对象有关,你是什么对象,则调用什么虚函数,即你是学生,就调用你学生的虚函数,即使你使用的类是人这个类。
不满足,那么调用函数是和类型有关的, 类型是什么,就在那个类型调用成员函数。

class Person {
public:
 virtual void BuyTicket() { cout << "买票-全价" << endl; }
};
class Student : public Person {
public:
 virtual void BuyTicket() { cout << "买票-半价" << endl; }
 };
void Func(Person& p)
{ p.BuyTicket(); }

int main()
{
 Person ps;
 Student st;
 
 Func(ps);
 Func(st);
 return 0;
 }

我们平时调用函数,是在类域中寻找这个函数,如这个例子,我们调用的方式p::函数,先确定类,然后在确定函数,而形成了多态后,就和类无关,即我是学生这个对象,虽然你是人这个类,但是是以我这个对象为主的,我是学生对象,所以调用的学生这个函数,虽然它的类是人这个类,因此为什么必须是父子类呢,因为这样才能切片赋值。

重写的例外:
协变,返回值可以不同,但必须是父子类的引用或者指针,只要是父子类就行,如子类的返回值可以是父类的指针。

派生类中可以将virtual关键字省略。

析构函数一般建议是构成多态的,这样可以子类给父类赋值后,不会因为类型而造成不调用析构函数。

person* p = new student;
delete p;

这样不构成多态的话,只会调用person父类的析构函数。

接下来我们来进行一下重写,重定义,重载的辨析:

首先重载是函数名相同且在同一作用域中的参数,类型等不同的现象,它与其他两者不同的关键在于,在同一的作用域中。

重定义是将函数完全隐藏,并且只要求函数名相同,重写要求函数名,返回值,参数相同,且是虚函数,如果不是虚函数,则构成重定义,两个父子类的同名函数,不是重写,就是重定义,重写只会改变函数的实现,并不会改变其他的任何事物,如缺省参数,就会直接继承父类的。

下面我们来介绍两个关键字,final和override
final 加上后可令类不可被继承,加在虚函数后面,不可被重写。

override,可检查子类对父类是否重写

class Car{
public:
 virtual void Drive(){}
};
class Benz :public Car {
public:
 virtual void Drive() override {cout << "Benz-舒适" << endl;}
};

抽像类:
首先我们介绍纯虚函数,在虚函数后面加个=0,便称为纯虚函数,且不需要实现,而包含纯虚函数的类,便称为抽像类,抽象类不能实例化出对象,且继承抽象类的还是抽象类。

纯虚函数作用是:强制了子类完成重写,表示抽象的类型,即现实的世界没有实体,比如方法。

普通的函数时一种实现的继承,是为了使用这个函数,即继承了这个函数就直接使用,而虚函数时接口继承,即我继承了你的函数的除函数体外的任何条件,但是函数的实现由我自己来完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值