纯虚函数可带实现,声明仍为“virtual void draw() const = 0;”,实现须在类外定义或类内内联定义;含纯虚函数的类为抽象类,不可实例化。

可以,纯虚函数允许有函数实现,但类仍为抽象类,无法实例化。
纯虚函数带实现的语法怎么写
在类内声明时仍用 = 0,实现必须写在类外(或类内内联定义);不能只在类内声明而不提供定义。
-
virtual void draw() const = 0;是声明,必须出现在类定义中 - 实现可写成:
void Shape::draw() const { /* 公共逻辑 */ }(在 .cpp 文件中) - 也可内联写:
virtual void draw() const = 0 { std::cout (C++11 起支持)
为什么需要给纯虚函数写实现
主要场景是:提供默认行为供派生类显式调用,或在析构链中被安全调用。
- 派生类中可通过
Base::func()显式调用基类实现,避免重复代码 - 纯虚析构函数
virtual ~Base() = 0必须有实现,否则链接失败(错误信息:undefined reference to `Base::~Base()`) - 普通纯虚函数带实现,不会影响抽象性——类依然不能 new 实例
常见误解和坑
很多人以为“= 0 就等于没函数体”,结果踩进链接或调用陷阱。
- 不写实现的纯虚析构函数,编译通过但链接失败——这是最常遇到的硬伤
- 写了实现但忘了加
override,派生类函数可能没真正覆盖,导致调用到基类实现而非预期逻辑 - 在构造/析构过程中调用虚函数,会绕过动态绑定,永远调用当前类版本(哪怕它是纯虚的),此时若未提供实现就崩溃
关键点在于:实现存在 ≠ 可被多态调用;= 0 的语义是“强制重写”,不是“禁止定义”。是否提供实现,取决于你是否需要它被显式调用或参与析构链。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











