一、构造/析构顺序及继承性1234567891011121314151617181920212223242526272829classA{private:int_a;public:A(inta 0): _a(a){cout A()this endl;}~A(){cout ~A()thisendl;}};classB :publicA{private:int_b;public:B(intb): _b(b), A(){cout B()this endl;}~B(){cout ~B()thisendl;}};结论1.构造顺序先构造基类后构造派生类2.析构顺序先析构派生类后析构基类二、拷贝构造的继承性12345678910111213141516171819202122232425262728293031323334353637classA{private:int_a;public:A(inta 0): _a(a){cout A()this endl;}A(constA src): _a(src._a){cout A(const A src)this endl;}~A(){cout ~A()thisendl;}};classB :publicA{private:int_b;public:B(intb): _b(b), A(){cout B()this endl;}B(constB src): _b(src._b){cout B(const B src)this endl;}~B(){cout ~B()thisendl;}};结论1.先调用基类缺省的构造函数后调用派生类的拷贝构造函数2.若派生类没有缺省构造函数A()就会报错疑惑如何去调用基类的拷贝构造而不是缺省构造12345678910111213141516171819202122232425262728293031323334353637383940414243444546#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}~B(){cout ~B()this endl;}};intmain(){B b(10);B b1(b);return0;}结果将B类型src传递给A类型的A(const A src)拷贝构造函数发生了赋值兼容规则切片现象三、赋值重载不具有继承性123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}A operator(constA src){if(this! src){_a src._a;cout A operator(const A src) endl;}}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}B operator(constB src){if(this! src){_b src._b;cout B operator(const B src) endl;}}~B(){cout ~B()this endl;}};intmain(){B b1(10);B b2(20);b1 b2;return0;}结论默认情况下仅仅调用了派生类的对象的赋值重载并未调用基类的赋值重载。解决方案12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}A operator(constA src){if(this! src){_a src._a;cout A operator(const A src) endl;}}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}B operator(constB src){if(this! src){*(A*)this src;//将调用基类赋值重载_b src._b;cout B operator(const B src) endl;}}~B(){cout ~B()this endl;}};intmain(){B b1(10);B b2(20);b1 b2;return0;}总结本篇文章就到这里了希望能够给你带来帮助
C++继承中的对象构造与析构和赋值重载详解
发布时间:2026/5/22 9:18:48
一、构造/析构顺序及继承性1234567891011121314151617181920212223242526272829classA{private:int_a;public:A(inta 0): _a(a){cout A()this endl;}~A(){cout ~A()thisendl;}};classB :publicA{private:int_b;public:B(intb): _b(b), A(){cout B()this endl;}~B(){cout ~B()thisendl;}};结论1.构造顺序先构造基类后构造派生类2.析构顺序先析构派生类后析构基类二、拷贝构造的继承性12345678910111213141516171819202122232425262728293031323334353637classA{private:int_a;public:A(inta 0): _a(a){cout A()this endl;}A(constA src): _a(src._a){cout A(const A src)this endl;}~A(){cout ~A()thisendl;}};classB :publicA{private:int_b;public:B(intb): _b(b), A(){cout B()this endl;}B(constB src): _b(src._b){cout B(const B src)this endl;}~B(){cout ~B()thisendl;}};结论1.先调用基类缺省的构造函数后调用派生类的拷贝构造函数2.若派生类没有缺省构造函数A()就会报错疑惑如何去调用基类的拷贝构造而不是缺省构造12345678910111213141516171819202122232425262728293031323334353637383940414243444546#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}~B(){cout ~B()this endl;}};intmain(){B b(10);B b1(b);return0;}结果将B类型src传递给A类型的A(const A src)拷贝构造函数发生了赋值兼容规则切片现象三、赋值重载不具有继承性123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}A operator(constA src){if(this! src){_a src._a;cout A operator(const A src) endl;}}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}B operator(constB src){if(this! src){_b src._b;cout B operator(const B src) endl;}}~B(){cout ~B()this endl;}};intmain(){B b1(10);B b2(20);b1 b2;return0;}结论默认情况下仅仅调用了派生类的对象的赋值重载并未调用基类的赋值重载。解决方案12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#includeiostreamusingnamespacestd;classA{private:int_a;public:A(inta 0) : _a(a){cout A()this endl;}A(constA src) : _a(src._a){cout A(const A src)this endl;}A operator(constA src){if(this! src){_a src._a;cout A operator(const A src) endl;}}~A(){cout ~A()this endl;}};classB :publicA{private:int_b;public:B(intb) : _b(b), A(){cout B()this endl;}B(constB src) : _b(src._b), A(src)//发生赋值兼容规则切片){cout B(const B src)this endl;}B operator(constB src){if(this! src){*(A*)this src;//将调用基类赋值重载_b src._b;cout B operator(const B src) endl;}}~B(){cout ~B()this endl;}};intmain(){B b1(10);B b2(20);b1 b2;return0;}总结本篇文章就到这里了希望能够给你带来帮助