开发笔记4
1: 关于接口类的编写规范:
class IExample {
public:
virtual void doSomething() = 0;
virtual ~IExample() {} // 虚析构函数
};
-
构造函数一般情况下不需要
虽然不需要构造函数,但是编译器还是会默认生成一个, 这个和抽象类不能实例化没有必然联系。(所以构造函数使用delete 是不对的)
个人理解:抽象类默认有构造函数 编译器会检测类中是否有纯虚函数, 检测有纯虚函数, 就会阻止实例化 -
析构函数通常是需要的, 最好是虚函数
确保在通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,防止内存泄漏
当你试图将抽象类(含有纯虚函数的类)的构造函数定义为 delete 时,编译器会报错:
在 C++ 中,当你构造一个派生类对象时,首先会调用基类的构造函数。因此,如果基类(抽象类)没有有效的构造函数,派生类也无法被构造。 虽然抽象类不能被实例化,但基类构造函数仍然是派生类构造函数的一部分。如果基类构造函数被删除了(= delete),这会导致派生类的构造变得不可行,因此编译器会报错。
2: qobject_cast 和 dynamic_cast 转换类型的区别:
qobject_cast :
在 Qt 中,qobject_cast 是一个特定的类型转换函数,用于将一个 QObject 类型的指针转换为其派生类的指针。它与 C++ 标准的类型转换(如 static_cast、dynamic_cast)有一些显著的区别和特点。让我们详细比较一下 qobject_cast 和其他常见类型转换(如 static_cast 和 dynamic_cast)的不同。
qobject_cast 是 Qt 提供的一个专门为 QObject 类设计的类型转换函数。它在进行类型转换时,依赖于 Qt 的 元对象系统(meta-object system)。qobject_cast 只能用于带有 Q_OBJECT 宏的类(即继承自 QObject 的类),并且它通常用于 跨类层次结构的类型转换。
- 运行时类型识别:qobject_cast 使用了 Qt 的元对象系统,因此它在运行时能够识别类型。这意味着它支持 多态性 和 类型安全的转换。
- 只适用于 QObject 类及其子类:只能用于具有 Q_OBJECT 宏的类,因此它与 Qt 的对象模型紧密相关。
- 返回 nullptr:如果类型转换失败,qobject_cast 返回 nullptr,而不是抛出异常或其他机制。
dynamic_cast :
- 多态转换:dynamic_cast 用于有虚函数的类之间的安全转换,即支持多态的类。
- 基类到派生类(向下转换):需要确保基类对象实际指向派生类对象,否则转换失败并返回 nullptr(指针类型)或抛出异常(引用类型)。
- 派生类到基类(向上转换):总是成功的,因为派生类包含基类的部分。