[email protected]子类类型转换为父类类型

static_cast(*this) to a base class create a temporary copy.

class Window {                                 // base class
public:
  virtual void onResize() { ... }              // base onResize impl
  ...
};

class SpecialWindow: public Window {          // derived class
public:
  virtual void onResize() {                   // derived onResize impl;
  static_cast<Window>(*this).onResize();      // cast *this to Window,
                                              // then call its onResize;
                                              // this doesn‘t work!
    ...                                       // do SpecialWindow-
  }                                           // specific stuff

  ...

};

Effective C++: What you might not expect is that it does not invoke that function on the current object! Instead, the cast creates a new, temporary copy of the base class part of *this, then invokes onResize on the copy! 

*******************************************************************************************

Contrast:

static_cast<Window>(*this)

with:

static_cast<Window&>(*this)

One calls the copy constructor, the other does not.

*******************************************************************************************

Because you are casting actual object not a pointer or reference. It‘s just the same with casting double to int creates new int - not reusing the part of double.

double类型转换为int型会创建一个新的int型变量?

*******************************************************************************************

上面的句子static_cast<Window>(*this).onResize();千万别改成下面这样,那样会更悲惨!

  virtual void onResize()
    {
        static_cast<Window*>(this)->onResize(); //调用基类的onResize()
        derived_ = 2;
        std::cout <<"S" << " base_=" << base_ << ",derived=" << derived_ << std::endl;
    }

实际上,可能只有C的高手初转C++,对C++对象的内存模型还不很清楚的情况下才会写成这样的代码。

对一个指针,不论我们怎样强制转换,它指向的那段内存的内容并没有改变。
函数把本类对象的指针强制转换为基类对象的指针,只意味着“通过这个指针只能访问基类的成员”了,而对象的内容并没有改变。onResize是虚函数,调用它是先通过对象中指向虚表的指针找到虚表,然后在虚表中找到onResize函数的指针,最后通过函数指针调用函数。  this指针强制转换后,内存没有改变,所以指向虚表的指针没有改变,所以它找到的虚表仍是派生类的虚表,自然找到的函数指针仍是派生类的onResize函数的指针,所以这里就成了一个无穷递归调用,结果就是消耗完栈空间。

将函数修改为这样:你就会看到不断的输出ReCall.
    virtual void onResize()
    {
        std::cout<<"ReCall"<<endl;
        static_cast<Window*>(this)->onResize(); //调用基类的onResize()
        derived_ = 2;
        std::cout <<"S" << " base_=" << base_ << ",derived=" << derived_ << std::endl;
    }

时间: 2024-10-20 06:14:15

[email protected]子类类型转换为父类类型的相关文章

小问题,小细节要注意(string类型转换为bool类型)

一个表中的推荐字段是bit类型的,添加的时候推荐有两个值,如<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal"> <asp:ListItem Text="是" Value="1"></asp:ListItem> <asp:ListItem Tex

pandas把&#39;&lt;m8[ns]&#39;类型转换为int类型进行运算

工作中经常碰到两列数据为date类型,当这两列数据相减或者相加时,得到天数,当运用这个值进行运算会报错:ufunc true_divide cannot use operands with types dtype('int64') and dtype('<m8[ns]'),我们只需要把'<m8[ns]'类型数据转换为int就可以继续运算 l = df1['计划结束时间'] - df1['计划开始时间']为: 这个数据是不能进行加减运算的 L = l.values / (24*60*60*100

Oracle 日期型 将timestamp类型转换为date类型

Oracle将timestamp类型转换为date类型有三种方法 1.使用to_char先转为字符型,在使用to_date再转为日期型 select to_date(to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') from dual; 2.使用SYSTIMESTAMP+0隐式转换 select systimestamp+0 from dual;                    --oracle会自

java -------- String类型转换为数字类型

将 String类型转换为数字类型的时候要注意,数据类型的范围 整型: byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1) int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1) long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的6

类型转换函数:将其他类型转换为当前类型

类型转换函数一般不会更改被转换的对象,所以通常被定义为const成员. 类型转换函数可以被继承,可以是虚函数. ? ? 以Double类型转换为bool类型为例: Double::operator bool() const { ????if (_num.size() > 1) ????????return true; ????return bool(_num[0]); } ? ? 原文地址:https://www.cnblogs.com/audacious/p/12236937.html

java中如何将Object类型转换为int类型

如何将Object类型转换为int类型 Object object = null; try { Integer.parseInt(object.toString()); } catch (NumberFormatException e) {} 也可以先判定一下是否是Integer //可以先判定一下是否是Integer Object object = "111"; if (object instanceof Integer) { Integer.parseInt(object.toSt

sql server将字符串类型转换为数值类型

在SQL Server中,将字符串的值转换为数值类型的值可以有三种方法. 1.使用cast()方法. select cast('6.0' as decimal(6, 2)); -- 6.00 2.使用convert()方法. select convert(decimal(6, 2), '100'); -- 100.00 3.使用与数值0相加的方法. select '233' + 0; -- 233 以上三种方法在转换类型的时候都要格外注意被转换类型的值,因为可能会出现各种强制转换失败的问题,比如

Object类型转换为String类型

1. Object.toString() 1 obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)Object 1 2 Object o = new Integer(100); String string = (String)o; 需要转换的类型必须是能够转换为String的,否则会出现CalssCastException异常错误. 3. String.valueOf(Object) 在使用Str

javaScript基础用Number()把其它类型转换为number类型

一:基本类型 字符串 把字符串转换为数字,只要字符串中包含任意一个非有效数字字符(第一个点除外)结果都是NaN,空字符串会变为数字零 console.log(Number("12.5")); //12.5 console.log(Number("12.5px")); //NAN console.log(Number("12.5.5px"));//NAN console.log(Number(""));//0 布尔 consol