关于C++子类在继承父类的构造函数时的一些情况

来源:互联网 发布:我老婆是网络女主播 编辑:程序博客网 时间:2024/05/24 01:45

1.子类没有定义构造方法,则调用父类的无参构造方法

#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();}

执行结果

0 0