1 | A* P=new B; //A是父类,B是子类 |
1 | B* q=new B;//这里和上面唯一的区别就是,将B类对象的地址赋给了派生类指针q |
而需要注意的是:可以将一个派生类对象的地址赋给基类指针和派生类指针,而一个基类对象的地址只能赋给基类指针,不能赋给派生类的指针。因为派生类不但拥有基类的方法属性,还有基类没有的属性方法。
将一个地址赋给一个指针前,通常会将该地址处的对象类型转换为指针所指的类型。而将一个基类地址赋给一个派生类指针是不允许的,如果可以的话,那么这个指针就可以调用派生类的方法和属性。但指针指向的是一个基类对象,而基类可能并没有这些方法和属性,因为这些方法和属性是派生类新增的,所以,基类地址赋给一个派生类指针是不允许的。但将一个派生类对象的地址赋给一个基类指针是可以的,因为,基类指针能调用的方法和属性,派生类都有,所以并不会有什么问题。
动态多态
子类重写虚函数以完成具体功能,用户通过指向基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到实际提供的子类对象上去。
动态多态是在运行时完成的。
1 | namespace DynamicPoly |
静态多态
编译期多态。
静态多态本质上是模板的具现化,
例:
1 | template<typename Widget,typename Other> |
代码要求:
类型T支持size、normalize、swap、拷贝构造、!=运算符
类型T在编译模板进行具现化时才表现为调用不同函数
Reference
I'm so cute. Please give me money.
- Post link: https://github.com/TheBge/TheBge.github.io/2020/12/29/%E7%90%86%E8%A7%A3%E5%A4%9A%E6%80%81/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub IssuesGitHub Discussions