c++纯虚函数怎么写_c++抽象类与接口定义

9次阅读

纯虚函数必须写为 virtual void func() = 0;它不允函数体,标记抽象类,派生类须全部实现否则仍为抽象类。

c++ 纯虚函数怎么写_c++ 抽象类与接口定义

纯虚函数的写法必须带 = 0

纯虚函数不是“没实现的虚函数”,而是语法上明确用 = 0 标记的成员函数。它不分配函数体,也不允许在类内定义(哪怕空实现)。编译器靠这个标记识别抽象类。

常见错误包括:

  • 写成 virtual void func() = 0; ✅ 正确
  • 写成 virtual void func() {} ❌ 这是普通虚函数,类仍可实例化
  • 写成 virtual void func() = 0 {} ❌ 语法错误,= 0 和函数体不能共存
  • 在类外定义纯虚函数(如 void Base::func() = 0;)❌ C++ 不允许,链接会失败

抽象类无法实例化,但可以声明指针或引用

只要一个类含至少一个纯虚函数,它就是抽象类。你不能写 Base obj;,但可以写 Base* p = new Derived();Base& ref = derived_obj;

关键点:

立即学习 C++ 免费学习笔记(深入)”;

  • 抽象类常作为接口基类,强制派生类实现关键行为
  • 析构函数若为虚函数(推荐),也建议设为纯虚——但需提供定义:
    virtual ~Base() = 0; // 声明 
    Base::~Base() {} // 必须在类外定义,否则链接失败
  • 抽象类可含普通成员变量、非纯虚函数、静态成员,和普通类一样

C++ 没有 interface 关键字,但可通过纯虚类模拟接口

所谓“接口类”,就是所有成员函数都是 public 纯虚函数、无数据成员、无构造函数实现的抽象类。它接近 Java/C# 的 interface 语义。

典型写法:

class Drawable {public:     virtual ~Drawable() = 0;     virtual void draw() const = 0;     virtual void resize(float scale) = 0; }; Drawable::~Drawable() = default;

注意:

  • 不加 public: 会导致默认 private,派生类无法重写
  • 接口类通常不提供构造逻辑,所以构造函数应为 protected 或 default
  • 多个接口类可通过多重继承组合,比如 class Button : public Drawable, public Clickable

派生类未实现全部纯虚函数,仍是抽象类

这是容易忽略的陷阱:只要有一个纯虚函数没被重写(哪怕只漏一个),派生类就还是抽象类,无法实例化。

检查方法:

  • 编译时若报错 cannot declare variable 'x' because the following virtual functions are pure,说明漏实现了某个纯虚函数
  • 使用 override 关键字能帮助捕获拼写错误或签名不匹配(如参数类型、const 限定符不一致)
  • 如果想让派生类“转发”某个纯虚函数而不实现,可以再声明一次 virtual void func() = 0;,但这会延续抽象性

纯虚函数的核心约束很硬:语法上必须 = 0,语义上强制派生类响应。它不提供多态的“便利”,而是划定契约的边界——漏掉一个 override,整个对象就立不起来。

text=ZqhQzanResources