c++复习基础要点02 虚函数与模板 与static inline是否共存

时间:2023-03-08 15:38:25
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函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是不可行的。