operator= 复制操作符的意外

首先,看以下的代码的输出时什么:

上述代码做了最理所当然的事。就是将Derived的两个对象进行了交换。可是通过指针进行的赋值输出却不是预期的:

居然调用的是Base的operator=,也就意味着我们把d2的Base部分赋值给了d1。而如今的d1就是“通常是自己的derived,一半是d2的Base”的怪物啦!

!!

看来编译器没有理会我们的意图,对于这种指针赋值都不能如愿,于是,我们须要的是动态类型,那么,我们能够将 “operator=虚化”。

可是通过指针复制通过了,可是一般的对象赋值却莫名其妙了。

于是乎,加入对象本身的赋值操作符也是非常有必要的。像以下这样:

结果为:

OK 大功告成。可是这仅仅是当中的一小步。对于多重继承的情况,上述的代码又会出现一些令人费解的答案:

[to be continued]

时间: 2024-08-03 16:34:54

operator= 复制操作符的意外的相关文章

C++ operator overload -- 操作符重载

C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 #include <iostream> #include <string> using namespace std; /* defualt operator= differ from my own one. * assign 0 or 1 to TEST_EQ, look the dif

C# to IL 5 Operator Overloading(操作符重载)

Every operator overload that we use in C#, gets converted to a function call in IL. Theoverloaded > operator translates into the function op_GreaterThan and a + gets convertedto op_Addition etc. In the first program of this chapter, we have overloade

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

c++ 复制控制 之赋值操作符

 重载操作符      重载操作符是一些函数, 其名字为operator后跟着其所定义的操作符符号.  如operator =, operator +, operator * 等等. 操作符函数和普通函数一样, 也是 返回值 + 函数名 + (形参表) , 形参表必须具有与该操作符操作数数目相同的形参(如果操作符是一个成员, 则包括隐式this形参). 赋值操作符 赋值 是二元运算, 所以该操作符函数有两个形参: 第一个形参对应着左操作数, 第二个形参对应右操作数. 大多数操作符可以定义为成员函

[C/C++]_[操作符重载operator type()和operator()的区别]

场景: 1.看到WTL的CWindow源码时会发现这样的operator重载,仔细看会发现它并不是重载()操作符. operator HWND() const throw() { return m_hWnd; } 如果重载()操作符,应该是,返回值HWND应该在operator的左边,而且应该有两个括号() HWND operator ()() const throw() { return m_hWnd; } 这种类型的操作符重载应该是type conversion operator(类型转换操

C++重载操作符operator

operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,>,+=,<<,>>,<<=,>>=,++,!=,<=,>=,&&,||,++,--,->*,->,(),[] 不可以被重载的操作符:.  .* :: ?: 2.基类对赋值操作符(=)重载不能被派生类继承. “+”操作符重

稍微深入点理解C++复制控制【转】

通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销该类的对象时会发生什么. 2.复制构造函数(copy constructor)是一种特殊的构造函数,具有单个形参,该形参(常用const)是对该类类型的引用: 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用复制构造函数: 当将该类的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造

boost实用工具:创建一个禁止复制的类 noncopyable

boost的noncopyable允许创建一个禁止复制的类,使用很简单,但很好用! C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394   /* boost_noncopya

C++ Primer 学习笔记_59_重载操作符与转换 --输入/输出、算术/关系操作符

重载操作符与转换 --输入/输出.算术/关系操作符 支持I/O操作的类所提供的I/O操作接口,一般应该与标准库iostream为内置类型定义的接口相同,因此,许多类都需要重载输入和输出操作符. 一.输出操作符<<的重载 为了与IO标准库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回ostream形参的引用! ostream &operator<<(ostream &os,const ClassType &