C++函数中那些不可以被声明为虚函数的函数
常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。
1、为什么C++不支持普通函数为虚函数?
普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。
2、为什么C++不支持构造函数为虚函数?
这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)
3、为什么C++不支持内联成员函数为虚函数?
其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)
4、为什么C++不支持静态成员函数为虚函数?
这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。
5、为什么C++不支持友元函数为虚函数?
因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。
*********************************************************************
1、顶层函数:多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层函数不属于成员函数,是不能被继承的。
2、构造函数:(1)构造函数不能被继承,因而不能声明为virtual函数。
(2)构造函数一般是用来初始化对象,只有在一个对象生成之后,才能发挥多态的作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是行不通的,如下例:
#include <iostream>
using namespace std;
class B
{
public:
B() {}
virtual void show()
{
cout<<"***"<<endl;
}
};
class D:public B
{
public:
D() {}
void show()
{
cout<<"==="<<endl;
}
};
int main(void)
{
B *pb;
D d; //先生成对象
pb=&d;
pb->show(); //再体现多态
pb=new D(); //先调用构造函数
pb->show(); //再多态
delete pb;
return 0;
}
3、static函数:不能被继承,只属于该类。
4、友元函数:友元函数不属于类的成员函数,不能被继承。
5、inline函数:inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。此外,一切virtual函数都不可能是inline函数。
C++函数中那些不可以被声明为虚函数的函数相关推荐
- 编写函数 int fac(int x)计算 x!的值。在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac)
编写函数 int fac(int x)计算 x!的值.在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac) 递归: #includ ...
- C语言:定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值。(要求使用指针做)
[问题描述]定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值.(要求使用指针做) ...
- PHP函数中true表示什么,使用返回true或false的函数的PHP最佳实践是什么?
After playing with PHP, I discovered that true is returned as 1 and false as null. 这不是真的(没有双关语意).与许多 ...
- python展开 c函数中的宏预处理_C 语言常用的预处理-宏函数
#include // 宏函数 三目运算符 #define MAX(A, B) A>B?A:B //宏函数 多行 添加\直接回车 #define LOOP(FROM, TO, CONTENT)\ ...
- c语言中被调用函数只需在主调函数中声明,其他函数中不用声明,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如题,程序如下: #include #include //malloc,calloc,free,realloc头文件 #define LEN sizeof ...
- c语言定义函数后引用,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如题,程序如下: #include #include //malloc,calloc,free,realloc头文件 #define LEN sizeof ...
- python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...
Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...
- 在qt中用c语言数组,在QT函数中返回一个数组/把一个数组传参给函数
1.把数组传参给函数 可以定义一个QVector的一个数组 QVector num(10); for(int i =0;i<10;i++) num [i] = i*i; fun(num); / ...
- 16.IDA-列出函数中存在的全部call(函数调用窗口,查看函数内调用了哪些call)
有时待分析的函数反汇编太长,需要确认此函数调用了哪些call 选择View▶Open Subviews▶Function Calls窗口 窗口的上半部分列出了所有调用当前函数(由打开窗口时光标所在位 ...
最新文章
- 支付宝蚂蚁森林合种树,2-4天领证,1/2号车满员,3号车成立
- 爱立信为T-Mobile荷兰全新的OTT TV业务提供强大支持
- openJDK与JDK的区别
- Excel+SQL数据库连接
- hadoop-0.21.0-eclipse-plugin无法在eclipse中运行解决方案
- 前端基础-html-文本格式化标签
- java cas并发_java并发之CAS
- Python 序列基本操作
- java如何调用脚本_Java如何调用脚本的特定功能?
- 你确定了项目,就不要乱变了
- WebService开发常用功能详解
- uitableView group模式下的间距问题
- 【BZOJ3294】放棋子(动态规划,容斥,组合数学)
- 关于STM32、温度传感器论文的参考文献
- 极光效果通发布重定向app拉活服务,为头部app提升DAU
- Application的启动流程
- 人在江湖走,谁能不忘事
- 拼写单词 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符
- 织梦多城市分站站群安装教程【二级域名版本】
- 老码农教你学英语(学习素材)