与C++中的构造函数相同,复制构造函数在对象生成过程中同样进行插入对应的Vtable虚表,但在成员变量赋值时,除具有复制构造函数的成员对象外,编译器合成复制构造函数其余均采用”Bitwise copy semantics(位逐次拷贝)”语义实现对象成员的拷贝,无论处于何种语境。测试代码如下:

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring> using namespace std; class A {
private:
char *str;
int len;
public:
A(const string &str) {
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "A()" << endl;
} A(const A&a) {
if(this != &a) { if(this->str) delete this->str; string str(a.str);
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "A(const A &a)" << endl;
}
} ~A() {
delete str;
str = NULL;
cout << "~A()" << endl;
}
}; class B {
private:
char *str;
int len;
string str_;
public:
B(const string &str) {
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "B()" << endl;
} ~B() {
delete str;
cout << "~B()" << endl;
}
}; class C:public A {
private:
char *str_;
int len;
public:
C(const string &str):A(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "C()" << endl;
} ~C() {
delete str_;
cout << "~C()" << endl;
}
}; class D {
private:
char *str_;
int len;
public:
D(const string &str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "D()" << endl;
} ~D() {
delete str_;
cout << "~D()" << endl;
} virtual void fun() {
cout << "D::fun()" << endl;
} }; class E:public virtual D { private:
char *str_;
int len;
public:
E(const string &str):D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "E()" << endl;
} ~E() {
delete str_;
cout << "~E()" << endl;
} virtual void fun() {
cout << "E::fun()" << endl;
}
}; class F:public virtual D { private:
char *str_;
int len;
public:
F(const string &str):D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "F()" << endl;
} ~F() {
delete str_;
cout << "~F()" << endl;
} virtual void fun() {
cout << "F::fun()" << endl;
}
}; class G:public E,public F { private:
char *str_;
int len;
public:
G(const string &str):E(str),F(str),D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "G()" << endl;
} ~G() {
delete str_;
cout << "~G()" << endl;
} virtual void fun() {
cout << "G::fun()" << endl;
}
}; void fun(D *d)
{
d->fun();
} //static A a("classA");
//static B b("classB");
//static C c("classC");
//static E e("classE");
static G g("classG");
int main(int argc, char *argv[])
{
//A a1 = a;
//B b1 = b;
//C c1 = c;
//E d1 = e;
E e1 = g;
F f1 = g;
fun(&e1);
fun(&f1);
//fun(&g);
return 0;
}

上面分别测试单继承,多继承,无继承,多态各种情况下,g++编译器合成复制构造函数的语义执行情况,未提供复制构造函数类成员均为”Bitwise Copy Semantics”语义,多态特性不受影响。

D()
E()
F()
G()
E::fun()
F::fun()
~F()
~D()
~E()
~D()
~G()
~F()
~E()
~D()

最新文章

  1. ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。
  2. JS中try....catch
  3. NSAssert的使用
  4. InitGoogleLogging坑爹
  5. NSDateFormatter 格式说明
  6. 屏幕录像专家V7.5(完美破解版,无水印)下载
  7. the process cannot access the file because it is being used by another process
  8. jstack jstat 简易使用教程
  9. 识别你的ADFS是什么版本的(Which version of ADFS is running)
  10. vi 常用命令使用說明
  11. ubuntu远程windows桌面
  12. 并行开发-Task
  13. idea中springboot项目程序入口右键不显示run as的原因
  14. [转帖] .NET FrameWork 版本的确定方法
  15. 数论知识点总结(noip范围)
  16. iOS 开发笔记 - 开发中如何实现自动检测更新APP
  17. SoapUI利用Groovy对response与断言的处理
  18. Delphi Webbrowser使用方法详解(一)
  19. WebApi参数问题方案
  20. python 面向对象 字典 有序字典

热门文章

  1. 制作登录界面,登录成功后把用户名放在session里,在第3个页面读取session显示用户名
  2. VB.NET中的除法运算符 与 C#中的除法运算符
  3. 移植linux-2.6.32.2到qq2440
  4. HDU-4522 湫湫系列故事——过年回家 最短路
  5. jQuery核心之jQuery Object及其相关的常用方法
  6. php总结 --- 4. 对象
  7. fsimage 和 edits log
  8. 20161025__Oracle10g双机备份
  9. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
  10. 用sqlplus为oracle创建用户和表空间&lt;转&gt;