c++,不能声明为虚函数的函数
1.顶层函数:多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层
函数不属于成员函数,是不能被继承的。
2.构造函数:
(1)构造函数不能被继承,因而不能声明为virtual函数
(2)构造函数一般是用来初始化对象,而只有在一个对象生成之后,才能发挥多态作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是行不通的,如下例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include "stdafx.h" #include "Stu.h" #include<iostream> using namespace std; class B { public : /* virtual B() --->编译错误 error C2633: “B”:“inline”是构造函数的唯一合法存储类 虚构造函数不是指在构造函数前加virtual,这样编译器不会通过的。 因为构造函数的的绑定总是静态绑定的。不可能为虚函数,不仅构造函数不能是虚拟的,且构造函数中调用其它虚的成员函数也不能实现多态,简而言之就是构造函数中不能调用虚函数,而所谓的虚拟构造函数就是为了解决这个问题的一个解决方案,她采用了一种所谓信封/信纸的方法实现。具体的可以参考C++编程思想这本书中的附录,里面有详细地解释。 另外,在设计模式中的factory method也被叫做virtual constructor,既虚构造器,当然它解决的问题和我前面所说的不一样。 有兴趣的朋友可以参考这两本书。相信可以对这个问题有一个比较全面地了解。 http://bbs.csdn.net/topics/40266387 */ B() { cout<< "BBBB" <<endl; } virtual void show() {cout<< "B***" <<endl;} }; class D: public B { public : D() { cout<< "DDD" <<endl; } void show() {cout<< "D===" <<endl;} }; void t1( void ) { B *pb;<br> D d; //1. 先生成对象 pb = &d; pb->show(); //再体现多态<br> pb = new D(); //2. new pb->show(); //再多态 delete pb; } /* BBBB DDD D=== BBBB DDD D=== 请按任意键继续. . . */ |
3.static函数:不能被继承,只属于该类。
4.友元函数:友元函数不属于类的成员函数,不能被继承。
5.inline函数:inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就
展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够
确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数
体现的是一种运行期机制。此外,一切virtual函数都不可能是inline函数。
源文档 <http://blog.sina.com.cn/s/blog_49652a2d0100ga6d.html>
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步