深刻理解继承中构造函数和析构函数
2017-04-09 21:46
253 查看
/*通过下列代码,打开和注释会发现不同结果,由此可解释基类的析构函数
为什么是虚函数:
理由:如果基类的析构函数不是虚函数,那么析构派生类就会先析构基类
再析构派生类,这显然与析构函数的设计理念不符
结论: 通过结果可得到c++ primer 第五版 555页warning:
在默认情况下,基类默认构造函数初始化派生类对象的基类部分。如果我们
想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显式
地使用基类的拷贝(或移动)构造函数*/
#include<iostream>
using namespace std;
class A
{
public:
A() { cout << "I'm A Construct" << endl; }
A(int n) { cout << "I'm A Transate Construct" << endl; }
virtual ~A() = default;
private:
int n;
};
class B :public A
{
public:
B() { cout << "I'm B Construct" << endl; }
B(int n)/*:A(n)*/ {cout << "I'm B Translate Construct" << endl;}
private:
int n;
};
int main()
{
B b(2);
system("pause");
return 0;
}
为什么是虚函数:
理由:如果基类的析构函数不是虚函数,那么析构派生类就会先析构基类
再析构派生类,这显然与析构函数的设计理念不符
结论: 通过结果可得到c++ primer 第五版 555页warning:
在默认情况下,基类默认构造函数初始化派生类对象的基类部分。如果我们
想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显式
地使用基类的拷贝(或移动)构造函数*/
#include<iostream>
using namespace std;
class A
{
public:
A() { cout << "I'm A Construct" << endl; }
A(int n) { cout << "I'm A Transate Construct" << endl; }
virtual ~A() = default;
private:
int n;
};
class B :public A
{
public:
B() { cout << "I'm B Construct" << endl; }
B(int n)/*:A(n)*/ {cout << "I'm B Translate Construct" << endl;}
private:
int n;
};
int main()
{
B b(2);
system("pause");
return 0;
}
相关文章推荐
- 理解构造函数、析构函数、赋值操作符函数不能被继承
- 第十一周 阅读程序4 类的继承构造函数与析构函数调用的先后顺序
- 多重继承的构造函数和析构函数
- JavaScripy关于对继承原型链,借用构造函数和组合继承的理解
- 继承中构造函数和析构函数的调用次序
- 第二学期第四周 阅读程序理解构造函数和析构函数
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 类继承中构造函数和析构函数的调用
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 继承中构造函数和析构函数的调用顺序
- 类式继承模式---临时构造函数理解
- 继承中,构造函数,赋值操作符,析构函数与虚函数的关系
- c++继承里面的构造函数和析构函数
- C++继承中构造函数、析构函数调用顺序及虚析构函数
- 继承和组合构造函数和析构函数的次序
- 继承和动态内存分配——需要为继承类定义 显式析构函数、复制构造函数和赋值运算符
- 深入理解C++类的构造函数与析构函数
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- javascript中继承(二)-----借用构造函数继承的个人理解
- C++构造函数的执行顺序及析构函数的执行顺序-多种情况:普通继承、虚拟继承、类构造函数调用其它类的构造函数