




抽象类因含纯虚函数(= 0)而无法实例化,此为编译期强制检查;派生类须显式实现所有继承的纯虚函数且签名一致,才成为具体类。
error: cannot declare variable 'x' to be of abstract type
抽象类只要包含至少一个 pure virtual function(纯虚函数),就失去构造具体对象的能力。这不是运行时限制,而是编译期强制检查——哪怕纯虚函数有实现体,只要声明为 = 0,该类就不可实例化。
常见错误场景:
Base obj;,其中 Base 含 virtual void f() = 0;
new Base 创建堆对象,同样失败派生类只有在**显式提供所有继承来的纯虚函数的非纯虚实现**后,才成为具体类(concrete class)。注意:重写必须是 public 且签名完全一致(返回类型协变除外)。
实操要点:
override 显式标注,避免因拼写/const/volatile 不匹配导致隐式继承纯虚性virtual void log() = 0 { std::cout ),不影响抽象性,也不免除派生类实现义务
抽象类的真正用途是作为接口规范,实际对象必须由子

Base* p = new Derived(); // OK:指向具体对象 Base& r = *p; // OK:绑定到具体对象 Base b; // ERROR:禁止
关键点:
new Derived() 成立的前提是 Derived 已实现全部纯虚函数std::make_unique () 或 std::shared_ptr (new Base)
create() ),模板实参必须是具体类型如果只为支持多态删除而声明纯虚析构函数(virtual ~Base() = 0;),**必须提供定义体**,否则链接失败。但这不改变抽象性——该类依然不可实例化。
正确写法:
class Base {
public:
virtual ~Base() = 0;
};
Base::~Base() {} // 必须定义,哪怕为空
容易踩的坑:
= 0 而不定义,链接时报 undefined reference to 'Base::~Base()'
抽象类的核心约束始终落在“是否所有纯虚函数都被覆盖”上,而不是有没有构造函数、有没有数据成员,或者析构函数怎么写。最常被忽略的是:即使只漏写一个 override,整个继承链就卡在抽象层动不了。