什么函数不能声明为虚函数
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。
设置虚函数须注意:
1:只有类的成员函数才能说明为虚函数;
2:静态成员函数不能是虚函数;
3:内联函数不能为虚函数;
4:构造函数不能是虚函数;
5:析构函数可以是虚函数,而且通常声明为虚函数。
设置虚函数须注意:
1:只有类的成员函数才能说明为虚函数;
2:静态成员函数不能是虚函数;
3:内联函数不能为虚函数;
4:构造函数不能是虚函数;
5:析构函数可以是虚函数,而且通常声明为虚函数。
类里面“定义”的成员函数是内联的,但是仍然可以成为虚函数,那么是不是可以说“内联函数不能成为虚函数”这句话有问题呢,是不是应该改成“显式定义的内联函数不能成为虚函数”。比如下面这个示例程序:
#include <iostream>
using namespace std;
class Base{
public:
virtual void f1(){cout < < "Father " < <endl;}
};
class Drived1:public Base{
public:
void f1(){cout < < "Son1 " < <endl;}
};
class Drived2:public Base{
public:
void f1(){cout < < "Son2 " < <endl;}
};
void myPrint(Base* pBs){
pBs-> f1();
}
int main()
{
Base father;
Drived1 son1;
Drived2 son2;
myPrint(&father);
myPrint(&son1);
myPrint(&son2);
system( "PAUSE ");
return 0;
}
输出:
Father
Son1
Son2
你可以发现,虽然f1在基类中定义的,按理说应该是内联函数,但是它仍然可以成为虚函
数。
#include <iostream>
using namespace std;
class Base{
public:
virtual void f1(){cout < < "Father " < <endl;}
};
class Drived1:public Base{
public:
void f1(){cout < < "Son1 " < <endl;}
};
class Drived2:public Base{
public:
void f1(){cout < < "Son2 " < <endl;}
};
void myPrint(Base* pBs){
pBs-> f1();
}
int main()
{
Base father;
Drived1 son1;
Drived2 son2;
myPrint(&father);
myPrint(&son1);
myPrint(&son2);
system( "PAUSE ");
return 0;
}
输出:
Father
Son1
Son2
你可以发现,虽然f1在基类中定义的,按理说应该是内联函数,但是它仍然可以成为虚函
数。
类中定义的成员函数(函数体在类中)能成为虚函数,大部分编译器能够将虽然声明为inline但实际上不能inline的函数自动改为不inline的。至于编译器会不会将inline and virtual的函数照模照样的实现,与编译器及优化方式有关。
要想成为虚函数,必须能够被取到地址.内联函数不能被取到地址所以不能成为虚函数.
你写inline virtual void f(),不能保证函数f()一定是内联的,只能保证f()是虚函数(从而保证此函数一定不是内联函数)
对于问题:
到底内联函数能不能成为虚函数?
答案是不能.问题是你不能够确定一个函数到底是不是inline的.inlien关键字只是对编译器的一个建议:"如果有可能,请把此函数搞成inline的"
你写inline virtual void f(),不能保证函数f()一定是内联的,只能保证f()是虚函数(从而保证此函数一定不是内联函数)
对于问题:
到底内联函数能不能成为虚函数?
答案是不能.问题是你不能够确定一个函数到底是不是inline的.inlien关键字只是对编译器的一个建议:"如果有可能,请把此函数搞成inline的"
相关推荐
- C++析构函数为什么要为虚函数
- vue 之 data为什么必须声明为返回一个初始数据对象的函数?
- c++常见面试题 转自:http://blog.csdn.net/wdzxl198/article/details/9102759/ 1.new、delete、malloc、free关系 2.delete与 delete []区别 3.C++有哪些性质(面向对象特点) 4.子类析构时要调用父类的析构函数吗? 5.多态,虚函数,纯虚函数 6.求下面函数的返回值(微软) 7.什么是“引用”?申明和使用“引用”要注意哪些问题? 8.将“引用”作为函数参数有哪些特点? 9.在什么时候需要使用“常引用”? 11、结构与联合有和区别? 12、试写出程序结果: 13.重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别? 14.有哪几种情况只能用intialization list 而不能用assignment? 15. C++是不是类型安全的? 16. main 函数执行以前,还会执行什么代码? 17. 描述内存分配方式以及它们的区别? 18.分别写出BOOL,int,flo
- 什么函数不能声明为虚函数
- 为什么基类的析构函数是虚函数?
- html页head中放入两个函数时不能调用,分离放在body中可以执行,为什么
- Item 七:将多态基类的析构函数声明为虚函数 Effective C++笔记
- 请教为什么类里面不能同时存在函数名和参数都一样的虚函数和静态函数
- 请教下面的函数,如果在主函数中memory(pointer,10);为什么程序会出现异常,既不能直接对a分配,在函数中定义p来分配也不行,该如何用函数分配呢
- 请教VS2013写C程序为什么不能用scanf函数
- 欧拉回路
- orcad 自带常用原理图库解析