420 字
2 分钟
C++入门 (十三) : 接口 (纯虚函数)
2026-03-20

纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数.

在 OOP 中,创建一个只包含未实现方法然后交由子类去实现功能的类是非常普遍的,这通常被称为interface(接口),接口就是一个只包含未实现的方法并作为一个模板的类。 并且由于此接口类实际上不包含方法实现,所以我们无法实例化这个类。

class Entity
{
public:
virtual std::string GetName() = 0; // 仍被定义为虚函数,但是=0实际上将它变成了一个纯虚函数
};

注意,有纯虚函数的类是无法实例化的.必须依靠子类来实例化,如果子类也没有实现该虚函数,子类也无法实例化

class Player : public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name) {}
std::string GetName() override { return m_Name; } // 如果注释掉则不能实例化
};
int main()
{
Entity* e = new Player(""); // 此时可以实例化
PrintName(e);
Player* p = new Player("Eureka");
}

例子#

#include<iostream>
#include<string>
class Printable{
public:
virtual std::string GetClassName() = 0;
};
class Entity : public Printable
{
public:
virtual std::string GetName (){ return "Entity";}
std::string GetClassName() override { return "Entity"; }
};
class Player : public Entity{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name) {}
std::string GetName() override { return m_Name; }
std::string GetClassName() override { return "Player"; }
};
void Print(Printable* obj){
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Entity* e = new Entity();
Player* p = new Player("Eureka");
Print(e);
Print(p);
std::cin.get();
};

纯虚函数的类确保子类有个特定的方法,那么就可以将子类作为参数传入一个通用的函数,然后我们就可以调用这个函数或者做些其他事。

C++入门 (十三) : 接口 (纯虚函数)
https://dingfengbo.vercel.app/posts/c入门/13-c接口-纯虚函数/
作者
Eureka
发布于
2026-03-20
许可协议
CC BY-NC-SA 4.0