系列文章目录
文章目录
前言
因为是自学C++,整理一些基础知识,总结自己的学习过程,希望有帮助
抽象类和接口的区别
- 抽象类(含成员变量)
- 抽象类不能被实例化
- 抽象函数一定会被重写
- 有抽象函数的一定是抽象类,不论有无其他成员函数
- 接口类(不含成员变量)
- 全都是纯虚函数
使用接口该注意什么
1、接口类中不应该声明成员变量,静态变量。
2、可以声明静态常量作为接口的返回值状态,这些静态变量需要初始化,访问时需要使用"接口类型::静态常量名"访问
2、定义的接口方法使用virtual 修饰符 和 “=0” 修饰,表示该方法是纯虚的函数,实现该接口的子类必须实现这些方法后才能实例化。
3、因为接口类是虽然无法创建对象的,但应该编写虚析构函数,如果使用的是派生类指针指向派生类对象,或者使用基类指针指向派生类对象且析构函数加了virtual,则和正常情况完全相同,即先执行派生类析构函数,再中间类2中间类1,再基类。但是如果使用基类指针指向派生类对象且析构函数没有加virtual,则会出现程序中断。具体原因如下:
1/基类虚析构函数,基类指针指向子类
class Base {
public:
Base() {};
virtual ~Base() { // 基类的析构函数是虚函数!
cout << "delete Base\n";
};
void DoSomething() {
cout << "Do Something in class Base!\n";
};
};
// 派生类
class Derived : public Base {
public:
Derived() {};
~Derived() {
cout << "delete Derived\n";
};
void DoSomething() {
cout << "Do Something in Derived\n";
};
};
结果是
Do Something in class Base!
delete Derived
delete Apple
delete Base
请按任意键继续. . .
Derived中的析构函数被调用了,它所拥有的Apple也被释放了,一切看起来很好,没有内存泄漏。
1.如果基类指针不加virtual那调用的时候只会调用基类对象本身的析构函数,忽略子类的析构,造成内存遗漏;
2.如果子类不写析构函数呢,编译器会默认让子类继承父类的虚析构函数,子类的析构函数也是虚函数,不会造成内存遗漏;
3.子类指针指向子类对象,毫无疑问
如何使用接口类?
参考文章
(29条消息) c++ 编写接口类(interface)举例_hp_cpp的博客-CSDN博客_c++实例化接口
(29条消息) 虚基类继承中的析构函数问题_Luckyh6的博客-CSDN博客_虚基类的析构函数
(29条消息) C++中的虚析构函数_hp_cpp的博客-CSDN博客_c++虚析构函数