结构体可以包含虚函数并实现多态。具体写法与类相同,使用virtual关键字声明虚函数,如struct base { virtual void show() { ... } }; 派生结构体重写函数并用override标记,通过基类指针调用可实现运行时多态。此时编译器会为结构体生成虚函数表和虚指针,带来内存和性能开销。因此在不需要多态的场景应避免使用虚函数,尤其在性能敏感或需严格内存布局的情况下。选择结构体还是类主要取决于设计风格:若以公开数据为主用struct更合适,若强调封装和抽象则用class,但两者功能上并无限制。

在C++中,结构体(struct)是完全可以包含虚函数的,而且它也能实现多态。很多人误以为只有类(class)才能支持面向对象的特性,其实从语言机制上来说,struct和class几乎是一样的,唯一的区别只是默认访问权限不同(struct默认是public,而class默认是private)。

所以结论很明确:结构体可以像类一样拥有虚函数,并通过继承与虚函数表实现多态行为。
结构体中的虚函数怎么写?
在结构体里声明虚函数的方式和类一模一样。只需要使用virtual关键字即可:
立即学习“C++免费学习笔记(深入)”;

struct Base {
virtual void show() {
std::cout << "Base show" << std::endl;
}
};
struct Derived : public Base {
void show() override {
std::cout << "Derived show" << std::endl;
}
};这时候,如果你用基类指针指向派生类对象:
Base* ptr = new Derived(); ptr->show(); // 输出 "Derived show"
这就实现了运行时多态。编译器会在背后为带有虚函数的结构体生成虚函数表(vtable),并维护一个指向它的指针(vptr)。

多态带来的开销你注意了吗?
虽然结构体可以实现多态,但也要注意一些潜在的性能影响:
- 每个带有虚函数的结构体实例都会隐含一个虚函数表指针(vptr),这会增加一点内存占用。
- 虚函数调用比普通函数慢,因为需要查表来确定实际调用哪个函数。
- 如果结构体原本用于表示纯数据(POD类型),加上虚函数后就不再是POD了,可能会影响与其他系统的兼容性或优化机会。
所以在设计结构体的时候,如果不需要多态,就没必要引入虚函数。特别是对性能敏感或内存布局要求严格的场景下,比如网络传输、文件存储等,应该避免让结构体变得“复杂”。
结构体 vs 类:选哪个更合适?
既然结构体和类都能实现多态,那到底该用哪个?
一般建议是:
- 如果你的类型主要是用来封装数据,且默认成员是公开的,那么用
struct更自然。 - 如果你定义的是复杂的抽象,有封装、继承、多态等需求,通常习惯上还是用
class。 - 最重要的是保持团队内部的一致性,不要在一个项目中混着用造成混乱。
不过这只是风格上的选择,不是语法限制。你可以完全用结构体写出一套面向对象的设计模式。
基本上就这些。结构体实现多态不复杂,但容易被忽略它其实也具备完整的OOP能力。










