zoukankan      html  css  js  c++  java
  • NO.8:绝不在构造或者析构过程中调用virtual函数

    在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数)

    如果在base class 构造函数或者析构函数调用virtual,derived class构造时会先构造base class,则base class中的virtual实际调用是base class的;

    第一种解释:derived class类先执行构造base class部分,然而在base class构造过程中,derived class部分是为初始化的,如果base class调用的virtual是derived clas则会发生可怕的错误,所以C++不允许,C++让virtual吊桶base class的.

    第二种解释(不算解释):构造/析构base class期间,virtual不是virtual(非正规说法)

    第三种解释(根本原因):在derived class构造base class期间,对象的类型是base class而不是derived class. 这些virtual会被正确 (resolv to),且RRTI类型检测也会认为是base class,因为C++ 认为derived class部分未被初始化,所以面对它们,C++最安全的做法是视它们不存在

     1 #include <iostream>
     2 
     3 
     4 class Base
     5 {
     6 public:
     7     Base()
     8     {
     9         Show();
    10     }
    11     virtual void Show()
    12     {
    13         std::cout<<"Base Show()"<<std::endl;
    14     }
    15 };
    16 
    17 
    18 class Derived: public Base
    19 {
    20 public:
    21     Derived():Base()
    22     {
    23 
    24     }
    25 
    26     void Show() override
    27     {
    28         std::cout<<"Derived Show()"<<std::endl;
    29     }
    30 };
    31 
    32 
    33 
    34 
    35 int main(int argc, char **argv)
    36 {
    37     Derived A;
    38     
    39     return 0;
    40 }
  • 相关阅读:
    css
    page
    Process Array
    multiprocessing
    page
    mid
    防御 CSRF
    django 常用过滤器
    template
    Android学习笔记28-对话框Dialog控件的使用
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7259784.html
Copyright © 2011-2022 走看看