3、异常
- 将可能会抛出异常的函数放入到try块中
- 用catch来接收异常(注意类型需要一致),可以catch多个不同类型的异常
- 在可能发生异常的地方抛出异常(throw)
- 栈解旋:throw-------->catch之间被压入栈的部分会在异常抛出之后被析构
- C++内置的异常类:
补充:
1、一般继承中如果想要使用基类指针指向派生类的话,需要将基类的析构函数写成虚析构函数,否则delete基类指针的时候派生类对象无法释放,从而造成内存泄露。
2、析构函数被继承过来了,但是构造函数不能够继承,我们在子类里面只是”调用“基类的构造函数。
class A
{
public:
int num;
A(int num): num(num)
{
cout << "A 的构造函数" << endl;
}
void print1()
{
cout << num << endl;
}
// virtual ~A() //!!!!! delete a时就不会造成内存的泄露
~A()
{
cout << "A 的析构函数" << endl;
}
};
class B : public A
{
public:
int num2;
B(int num, int num2): A(num)
{
cout << "B 的构造函数" << endl;
num2 = num2;
}
void print2()
{
cout << num2 << endl;
}
~B()
{
cout << "B 的析构函数" << endl;
}
};
//析构函数被继承过来了,但是构造函数不能够继承,我们在子类里面只是”调用“基类的构造函数。
int main()
{
A *a = new B(1, 2); //堆上new需要delete 继承中使用基类指针指向派生类意义:避免内存泄露
// A *a;
// B b(1, 2);
// a = &b; //a是栈上面的,所以 no delete
a->print1();
delete a; //A的析构函数不是virtual的话,只会调用A的析构函数,而不会调用B的析构函数