C++整理记录

文章介绍了C++中的抽象类与接口的区别,强调接口不应包含成员变量且方法需为纯虚函数。还讨论了使用接口时应注意的事项,如避免在接口中声明成员变量,确保使用virtual修饰符和纯虚函数声明。此外,文章详细阐述了虚析构函数的重要性,特别是在多态场景下防止内存泄漏的角色。
摘要由CSDN通过智能技术生成

系列文章目录

文章目录


前言

因为是自学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++虚析构函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值