(1)静态多态:地址早绑定,编译阶段确定函数地址。代表:函数重载、运算符重载
(2)动态多态:地址晚绑定,运行阶段确定函数地址.
1)类之间需要有继承关系
2)实现多态的函数需要以virtual来进行声明. (虚函数)
3)父类中的虚函数需要被子类重写
重写:返回值、函数名、参数都必须一致.
class A
{
virtual void fun(int_ _n1);
};
class B:pub1ic A
{
virtual void fun(int_ n1); //重写A中的虚函数。
};
1) 结构清晰,便于理解
2) 利于后期代码扩展、维护.实现了对修改屏蔽、对扩展开放.
需要使用父类指针或父类引用指向子类对象,直接将子类对象赋值给父类对象是不行的.
1)
Base *b =
new Son1; //父类指针指向子类对象
b->fun(); //调用 子类中的函数。
2)Son1 s1;
Base &b = s1;
b. funO; / /调用子类中的函数
Base b2;
b2 = s1;
- #include
- using namespace std;
- class Animal
- {
- public:
- virtual void Speak()
- {
- cout<<"animal speak"<
- }
-
- };
-
- class Cat:public Animal
- {
- public:
- virtual void Speak()
- {
-
- cout<<"cat speak"<
- }
- };
- class Dog:public Animal
- {
- public:
- virtual void Speak()
- {
-
- cout<<"dog speak"<
- }
- };
-
- void AnimalSpeak(Animal &a1)
- {
- a1.Speak();
- }
-
- void test01()
- {
- Animal a2;
- AnimalSpeak(a2);
-
- Dog d1;
- AnimalSpeak(d1);
-
- Cat c1;
- AnimalSpeak(c1);
- }
-
- int main(int argc, char *argv[])
- {
- test01();
- return 0;
- }
代码02):多态的优点
- #include
- using namespace std;
- #include
- using namespace std;
-
- class Calculator
- {
- public:
- Calculator():_num1(0), _num2(0)
- {
-
- }
- virtual int CalculateFun()
- {
- return 0;
- }
- int _num1;
- int _num2;
- };
-
- class AddCal: public Calculator //利于后期代码扩展、维护.
- {
- public:
- AddCal()
- {
- _num1 = 0;
- _num2 = 0;
- }
- AddCal(int n1, int n2)
- {
- _num1 = n1;
- _num2 = n2;
- }
-
-
- int CalculateFun()
- {
- return _num1 + _num2;
- }
- };
-
-
-
- int CalResultFun(Calculator &cal)
- {
- int ret = cal.CalculateFun();
- return ret;
- }
-
- void test01()
- {
- AddCal c1(23, 56);
- cout << CalResultFun(c1) << endl;
- }
-
- int main()
- {
- test01();
- return 0;
- }
-
3、虚函数
(1)就是virtual 修饰的成员函数.
(2)虚函数要求必须有实现过程,不能只是声明.
class A
{
virtual void fun(int); //声 明
}
void A: :fun(int_ n1) //实现过程
{
}
(3)纯虚函数:
1)有时候,父类里面的虚函数根本没有实现的必要,此时可以声明为纯虚函数.不用具体实现。
class A
virtual void fun(int) = 0; //纯虚函数声明
2) 有纯虚函数的类被称为抽象类,抽象类不能实例化对象.
4、析构函数
在多态的使用过程中,如果子类对象空间开辟到堆区(使用new方式),那么父类指针在释放时无法调用子类的析构代码。将父类中的析构改为虚析构,则可以解决该问题.
-
相关阅读:
中石油测井-技术研发岗回顾
[网络工程师]-应用层协议-电子邮件协议
数据挖掘与分析课程笔记(Chapter 14)
液晶显示计算器(延时程序)
JavaScript Promise
0202hdfs的shell操作-hadoop-大数据学习
JavaScript基础(5)_运算符
C++八皇后问题代码
v-html有什么问题
奇妙的房树人测验:教你看画识人心
-
原文地址:https://blog.csdn.net/qq_63626307/article/details/126755599