什么时候编译器会合成派生类的构造函数
2016-04-10 20:55
169 查看
1.派生类继承的基类中缺省的构造函数时
源代码:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{ }
void FunTest()
{ }
int m_a;
};
class Der : public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s3.51cto.com/wyfs02/M02/7E/D5/wKioL1cKSFnCwlFaAAAzaAFusqI452.png)
如果去掉基类中
Base(){ }在看看汇编
![](http://s5.51cto.com/wyfs02/M00/7E/D8/wKiom1cKSCSxP7YxAAAsUrL_raI052.png)
2.派生类虚拟继承基类时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
void FunTest()
{ }
int m_a;
};
class Der : virtual public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s4.51cto.com/wyfs02/M01/7E/D8/wKiom1cKSPSwEdREAABH6JeR0AE677.png)
如果去掉继承列表中的virtual在看看汇编
![](http://s1.51cto.com/wyfs02/M01/7E/D5/wKioL1cKSe-D6ZcoAAApQQN0RVU137.png)
3.派生类中有其他类类型的成员(该类有缺省的构造函数)时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
void FunTest()
{ }
int m_a;
};
class T
{
public:
T()
{ }
void FunTest()
{ }
int m_a;
};
class Der :public Base
{
public:
void FunTest1()
{ }
T test;
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s1.51cto.com/wyfs02/M02/7E/D9/wKiom1cKS0mDLczPAAA812TQSSs215.png)
如果去掉T类中T(){ }在看看汇编
![](http://s2.51cto.com/wyfs02/M00/7E/D9/wKiom1cKS32iRLzYAAArlWago28105.png)
4.派生类或基类中有虚函数的出现时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void FunTest()
{ }
int m_a;
};
class Der :public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s4.51cto.com/wyfs02/M00/7E/D6/wKioL1cKTSbAR84AAABBmBItTTA406.png)
如果去掉Base类函数FunTest()前的virtual在看看汇编
![](http://s1.51cto.com/wyfs02/M02/7E/D9/wKiom1cKTOiyLKrpAAAyviA63iE071.png)
源代码:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{ }
void FunTest()
{ }
int m_a;
};
class Der : public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s3.51cto.com/wyfs02/M02/7E/D5/wKioL1cKSFnCwlFaAAAzaAFusqI452.png)
如果去掉基类中
Base(){ }在看看汇编
![](http://s5.51cto.com/wyfs02/M00/7E/D8/wKiom1cKSCSxP7YxAAAsUrL_raI052.png)
2.派生类虚拟继承基类时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
void FunTest()
{ }
int m_a;
};
class Der : virtual public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s4.51cto.com/wyfs02/M01/7E/D8/wKiom1cKSPSwEdREAABH6JeR0AE677.png)
如果去掉继承列表中的virtual在看看汇编
![](http://s1.51cto.com/wyfs02/M01/7E/D5/wKioL1cKSe-D6ZcoAAApQQN0RVU137.png)
3.派生类中有其他类类型的成员(该类有缺省的构造函数)时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
void FunTest()
{ }
int m_a;
};
class T
{
public:
T()
{ }
void FunTest()
{ }
int m_a;
};
class Der :public Base
{
public:
void FunTest1()
{ }
T test;
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s1.51cto.com/wyfs02/M02/7E/D9/wKiom1cKS0mDLczPAAA812TQSSs215.png)
如果去掉T类中T(){ }在看看汇编
![](http://s2.51cto.com/wyfs02/M00/7E/D9/wKiom1cKS32iRLzYAAArlWago28105.png)
4.派生类或基类中有虚函数的出现时
代码:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void FunTest()
{ }
int m_a;
};
class Der :public Base
{
public:
void FunTest1()
{ }
};
void Test()
{
cout << "********" << endl;
Der d;
}
int main()
{
Test();
getchar();
return 0;
}
看看汇编
![](http://s4.51cto.com/wyfs02/M00/7E/D6/wKioL1cKTSbAR84AAABBmBItTTA406.png)
如果去掉Base类函数FunTest()前的virtual在看看汇编
![](http://s1.51cto.com/wyfs02/M02/7E/D9/wKiom1cKTOiyLKrpAAAyviA63iE071.png)
相关文章推荐
- 浅谈汇编器、编译器和解释器
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- 基于JSP编译器基本语法的使用详解
- C#命令行编译器配置方法
- Java虚拟机JVM性能优化(二):编译器
- AngularJS HTML编译器介绍
- 实现接口时@Override注解问题
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- g++编译 参数 .
- 关于 ndk和jni的区别
- vim中的杀手级插件: YouCompleteMe
- Google C++ unit test 在ARM Android 2.3 上的编译与使用
- 从代码示例了解ECMAScript5新特性
- Java的可移植性受到广泛使用
- C++ .H .CPP
- Windows Server 2003远程桌面多用户连接问题
- centos下安装nginx