c++复习基础要点02 虚函数与模板 与static inline是否共存
1. 虚函数能否定义为模板函数
当一个类有虚函数时,它一定有一个虚表,用来纪录每个虚函数的实际地址。这也就是说这个虚表的大小是在编译期就确定了的。有多少个虚函数,虚表就纪录几个。
类中的模板函数函数会根据具体的类型而实例化,这也就是说这个模板函数会实例多少个函数出来是不知道的,这样,虚表的大小就不好确定了。所以在现有的编译器的情况下,虚函数不能是模板函数。当然以后可能会支持这种情况。
2. 虚函数能否定义为static类型
不能。成员函数不可同时为virtual和static。
多态实现的基本原理是每个带有virtual函数的类的【实例】要包含一个指针,指向虚函数表(vtbl)。
static函数做为类函数,不与任何【实例】相关,自然无法实现多态了。
3. 纯虚函数是否可以被定义为private的?如果可以,具体用在什么情况下?
纯虚函数可以被定义成private。
具体的实现:
用public的虚函数调用private的纯虚函数
class A
{
public:
void fun()
{
f();
}
private:
void f()=0;
};
4. 内联函数能不能定义成虚函数啊?
1.内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
2.我们之所以能看到一些象内联函数的虚函数,是因为某个函数是否是内联函数不是由我们说的算,而是由编译器决定的。我们只能向编译器建议,某个函数可以是内联函数(inline关键字),但是编译器有自己的判断法则。所以可能出现这样的情况:
2.1 我们用inline声明的函数却没有inline
2.2 我们没有用inline声明的函数却是inline
2.3 对于inline函数,编译器仍然将它编译成一个有地址的函数
由于virtual函数不能是inline,所以inline标识不起作用,仍然是动态运行决定
5. 构造函数不能为虚函数
构造函数一般是用来初始化对象,只有在一个对象生成之后,才能发挥多态的作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是不可行的。