赞
踩
目录
2.3.2、override:检查派生类的虚函数是否重写了基类的某个虚函数,如果没有重写编译会报错。
比如买票这件事情,当成人买票是全价,学生买票是半价,儿童不需要买票。不同的对象完成同一件事产生不同的结果。
拥有不同继承关系的对象,在调用相同的类成员时产生出不同的结果。
多态构成的条件:
在类中被virtual关键字修饰的函数,叫做虚函数。
只有虚函数才会重写,并且满足的条件是:两个虚函数函数名相同、参数列表相同、返回值类型相同、就会构成重写(或者叫覆盖),函数重写之后,基类的虚函数所实现的功能将会被派生类同名虚函数的功能所覆盖。
- #include<iosteam>
- using namespace std;
- class Person {
- public:
- virtual void work() { cout << "上课" << endl; }
- };
- class Student : public Person {
- public:
- virtual void work() { cout << "听课" << endl; }
- //此处函数如果没有virtual修饰也构成重写关系
- };
- void Func(Person& p)
- { p.work(); }
- int main()
- {
- Person ps;
- Student st;
-
- Func(ps);
- Func(st);
- return 0;
- }
派生类重写基类时,两个虚函数的返回值类型不同,基类返回的是基类对象的指针或者引用,派生类返回派生类对象的指针或者引用。通过下面这个例子大家就能理解。
- #include <iostream>
- using namespace std;
- /* 什么叫做协变呢,一共有四个类,A B Person Student 类,B继承自A,Student继承自
- Person 当Person中虚函数返回值为A的指针或者引用,Student中的同名虚函数返回B类的
- 对象指针或者引用的时候两个类构成重写*/
- class A
- {};
- class B : public A
- {};
- //class Person
- //{
- //public:
- // virtual A* f()
- // { return new A; }
- //};
- //class Student : public Person
- //{
- //public:
- // virtual B* f()
- // {
- //
- // return new B;
- // }
- //};
-
- class Person
- {
- public:
- virtual Person* f()
- {
- return new Person;
- }
- };
- class Student : public Person
- {
- public:
- virtual Student* f()
- {
-
- return new Student;
- }
- };
-
- int main()
- {
- A a;
- B b;
- Person p;
- Student s;
- p.f();
- s.f();
-
- system("pause");
- return 0;
- }
为什么会出现析构函数的重写呢?明明他们俩的函数名并不相同.
此处就要说了,起始所有类的析构函数底层都是通过destructor实现的,在底层他们的名字是相同的。
那它的应用场景是什么呢?
一般情况下我们是不会在类中实现析构函数的,使用的是系统提供的默认析构函数,但是一旦当我们实现之后,系统将会使用用户定义的析构。当我们将派生类指针强转成基类指针时,并且派生类重写了基类虚析构函数,在如下情境下,系统销毁对象时,会先调用派生类的析构函数,再会调用基类的构造函数,保证了正常的析构过程
- #include <iostream>
- using namespace std;
- class Person {
- public:
- virtual ~Person() { cout << "~Person()" << endl; }
- };
- class Student : public Person {
- public:
- virtual ~Student() { cout << "~Student()" << endl; }
- };
- // 只有派生类Student的析构函数重写了Person的析构函数,下面的delete对象调用析构函数,才能构成
- //多态,才能保证p1和p2指向的对象正确的调用析构函数。
- int main()
- {
- Person* p1 = new Person;
- Person* p2 = new Student;
- delete p1;
- delete p2;
- //system("pause");
- return 0;
- }
重载:
重写:
隐藏:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。