关于C++子类在继承父类的构造函数时的一些情况
2015-11-12 22:29
771 查看
1.子类没有定义构造方法,则调用父类的无参构造方法
2.如果子类定义了构造方法,不论是无参数的还是带参数的,在创建子类对象的时候,首先执行父类的无参构造方法,然后执行自己的构造方法。
3.在创建子类对象的时候,如果子类的构造函数没有显示的调用父类的构造函数,则会调用父类的默认无参构造函数。
此处父类的默认无参构造函数是当用户没有定义的时候,编译器默认生成的构造函数。
4.在创建子类对象时,如果子类的构造函数没有显示调用父类的构造函数,自己提供了无参构造函数,则会调用父类自己的无参构造函数。
函数实现同第二种。
5.在创建子类对象时,如果子类的构造函数没有显示的调用父类的构造函数只定义了自己的有参构造函数,则会出错。(如果父类只有有参构造方法,则子类必须显示的调用此有参构造方法)
#include<iostream> #include<string> //如果子类没有定义构造方法,则调用父类的无参构造方法 class BaseClass { public: BaseClass(); BaseClass(std::string theName); void dosomething(); private: std::string Name; }; BaseClass::BaseClass() { BaseClass::Name = "koudan" ; std::cout << "此时调用父类的无参构造函数\n" << std::endl; } BaseClass::BaseClass(std::string theName) { BaseClass::Name = theName; std::cout << "此时调用父类的有参构造函数\n" <<std::endl; } void BaseClass::dosomething() { std::cout << "执成员函数void dosomething() \n" << std::endl; } class SubClass: public BaseClass {}; int main() { SubClass subclass; subclass.dosomething(); return 0; }
2.如果子类定义了构造方法,不论是无参数的还是带参数的,在创建子类对象的时候,首先执行父类的无参构造方法,然后执行自己的构造方法。
#include<iostream> #include<string> //如果子类定义了构造方法,不论是无参数的还是带参数的,在创建子类对象的时候,首先执行父类的无参构造方法,然后执行自己的构造方法。 class BaseClass { public: BaseClass(); BaseClass(std::string theName); void dosomething(); std::string Name; }; BaseClass::BaseClass() { BaseClass::Name = "koudan" ; std::cout << "此时调用父类的无参构造函数\n" << std::endl; } BaseClass::BaseClass(std::string theName) { BaseClass::Name = theName; std::cout << "此时调用父类的有参构造函数\n" <<std::endl; } void BaseClass::dosomething() { std::cout << BaseClass::Name << "\n" << std::endl; std::cout << "执成员函数void dosomething() \n" << std::endl; } class SubClass: public BaseClass { public: SubClass(); SubClass(std::string theName); }; SubClass::SubClass() { SubClass::Name = "LiuJiaYu"; } SubClass::SubClass(std::string theName) { SubClass::Name = theName; } int main() { std::cout << "实例化子类对象,调用无参构造函数:\n" <<std::endl; SubClass subclass; subclass.dosomething(); std::cout << "实例化子类对象,调用有参构造函数:\n" <<std::endl; SubClass subclass1("subclass"); subclass1.dosomething(); return 0; }
3.在创建子类对象的时候,如果子类的构造函数没有显示的调用父类的构造函数,则会调用父类的默认无参构造函数。
此处父类的默认无参构造函数是当用户没有定义的时候,编译器默认生成的构造函数。
4.在创建子类对象时,如果子类的构造函数没有显示调用父类的构造函数,自己提供了无参构造函数,则会调用父类自己的无参构造函数。
函数实现同第二种。
5.在创建子类对象时,如果子类的构造函数没有显示的调用父类的构造函数只定义了自己的有参构造函数,则会出错。(如果父类只有有参构造方法,则子类必须显示的调用此有参构造方法)
#include<iostream> #include<string> class A { public: A(std::string theName); void dosomething(); protected: std::string Name; }; A::A(std::string theName) { std::cout << "父类的有参构造函数" << std::endl ; A::Name = theName; } void A::dosomething() { std::cout << A::Name << std::endl; } class B: public A { public: B(std::string theName); }; //子类显示地调用父类的有参构造函数 B::B(std::string theName):A(theName) { std::cout << "子类显示的调用父类的有参构造函数" << std::endl; } int main() { B b("son"); std::cout << "有参构造函数:" << std::endl ; b.dosomething(); }
相关文章推荐
- c++ 引用和指针的区别
- C/C++学习流程
- 【黑马程序员】C语言学习笔记(3)-预处理指令
- C++ STL@ list 应用 (leetcode: Rotate Array)
- c语言模拟实现oc引用计数
- Prime C++ copy 构造函数
- 拇指接龙游戏升级记录03(升级MainScene.cpp)
- 拇指接龙游戏升级记录03(升级MainScene.cpp)
- Cpp--const限定符
- 在Ubuntu上使用eclipse开发C++[持续更新...]
- C/C++ debug(一)
- __stdcall,__cdcel,extern c 和导出函数名
- 结合C++和GDAL实现shapefile(shp)文件的创建和写入
- C++中的delete和delete[]区别
- 网易MOOC教育之软件工程(C编码实践篇)学习总结
- leetcode笔记:Best Time to Buy and Sell Stock IV
- c++学习第一课
- 最大公共子串(C语言实现)
- C++中的vector< vector<int> > v(m, vector<int>(n) );是什么意思
- C语言格式化输入输出