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

       

  • 相关阅读:
    Linux指令面试题01-进程查看与终止
    微信网页授权
    腾讯视频怎么转成mp4模式 软件 工具 方法 最新【已解决】
    表操作,多对一、多对多、一对一
    初识数据库,基础sql语句
    IO多路复用
    协程:gevent
    线程:threading
    进程:multiprocessing
    利用socket与ssl模块读取网页内容
  • 原文地址:https://www.cnblogs.com/james1207/p/3343419.html
Copyright © 2020-2023  润新知