很奇怪的动物查数方式(虚函数)"/>
c++初级代码(1.3)——很奇怪的动物查数方式(虚函数)
多态
在C++中存在可以用基类的指针访问派生类的成员的机制,被称为多态。
我们可以在面向对象方法中了解到派生类应该是基类的细致化,也就是说一个派生类一定是一个基类(一只狗一定是一个动物),所以派生类继承了基类的属性(一部分protected和public成员变量)以及行为(成员函数),多态个人认为是指派生类和基类在进行同一个行为的时候也会有不同的差异,可以认为在继承过程中发生了变异(?)
派生的一些特点:
派生类对象可以赋值给基类对象,反之不可以。
派生类对象可以初始化基类引用,派生对象地址可以赋值给基类指针
在派生类和基类定义了同名的成员函数的时候基类的该成员函数会被覆盖,无法调用。
多态的一些表现:
派生类的指针可以赋值给基类指针,
通过基类指针调用基类与派生类中同名的虚函数的时候:
(1)若指针指向一个派生类的对象,那么调用派生类中的虚函数。
(2)若指针指向一个基类的对象,那么就调用基类中的虚函数。
指针同时也可以是引用。
使用的情况:
比如好多派生类来自于一个基类,但是又稍有一些差别->多态解决。
例题:
#include <iostream>
using namespace std;
// 在此处补充你的代码class Animal{public:static int number;Animal(){number++;}virtual ~Animal(){number--;//这里是虚析构函数,因为在main程序中出现了多态的情况,}
};
class Dog:public Animal{public:static int number;Dog(){number++;}~Dog(){number--;//如果基类已经有同名字的虚函数那么派生类无需再指出。}};
class Cat:public Animal{public:static int number;Cat(){number++;}~Cat(){number--;}};
int Animal::number=0;
int Dog::number=0;
int Cat::number=0;
void print() {cout << Animal::number << " animals in the zoo, " << Dog::number << " of them are dogs, " << Cat::number << " of them are cats" << endl;
}int main() {print();Dog d1, d2;Cat c1;print();Dog* d3 = new Dog();Animal* c2 = new Cat;//这里有多态的产生,要记住派生类的构造函数是按顺序来的,所以cat只需要增加cat的数目Cat* c3 = new Cat;print();delete c3;delete c2;/*这里delete我们需要调用cat的析构函数之后按顺序调用animal的虚构函数,所以不希望直接执行基类的析构函数 *///调用完派生类的析构函数之后会自动开始析构基类对象。所以这里不需要管animal--。delete d3;//所以这里用到了多态,即使是基类指针也可以使用派生类的析构函数print();
}
更多推荐
c++初级代码(1.3)——很奇怪的动物查数方式(虚函数)
发布评论