尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C++虚函数与运行时多态

C++虚函数与运行时多态
📅 发布时间:2026/6/20 4:33:12

C++虚函数与运行时多态

虚函数通过虚函数表(vtable)和虚函数指针(vptr)实现运行时多态。当通过基类指针或引用调用虚函数时,程序根据对象的实际类型动态分派到正确的函数实现。

虚函数使用virtual关键字声明,派生类使用override关键字明确重写意图。

#include
#include
#include
#include

class Animal {
public:
virtual ~Animal() = default;

virtual void make_sound() const {
std::cout << "Animal makes a generic sound\n";
}

virtual void move() const {
std::cout << "Animal moves\n";
}

void describe() const {
std::cout << "This is an animal\n";
}
};

class Dog : public Animal {
public:
void make_sound() const override {
std::cout << "Dog barks: Woof!\n";
}

void move() const override {
std::cout << "Dog runs on four legs\n";
}
};

class Cat : public Animal {
public:
void make_sound() const override {
std::cout << "Cat meows: Meow!\n";
}

void move() const override {
std::cout << "Cat walks gracefully\n";
}
};

void polymorphism_demo() {
std::vector> animals;
animals.push_back(std::make_unique());
animals.push_back(std::make_unique());

for (const auto& animal : animals) {
animal->make_sound();
animal->move();
std::cout << "---\n";
}
}

纯虚函数定义接口契约,包含纯虚函数的类是抽象类,不能实例化。

class Shape {
public:
virtual ~Shape() = default;
virtual double area() const = 0;
virtual double perimeter() const = 0;
virtual void draw() const = 0;
};

class Circle : public Shape {
double radius_;
public:
explicit Circle(double r) : radius_(r) {}

double area() const override {
return 3.14159265358979 * radius_ * radius_;
}

double perimeter() const override {
return 2.0 * 3.14159265358979 * radius_;
}

void draw() const override {
std::cout << "Circle (radius=" << radius_ << ")\n";
}
};

class Rectangle : public Shape {
double width_, height_;
public:
Rectangle(double w, double h) : width_(w), height_(h) {}

double area() const override { return width_ * height_; }
double perimeter() const override { return 2 * (width_ + height_); }

void draw() const override {
std::cout << "Rectangle (" << width_ << "x" << height_ << ")\n";
}
};

void abstract_class_demo() {
std::vector> shapes;
shapes.push_back(std::make_unique(5.0));
shapes.push_back(std::make_unique(4.0, 6.0));

double total = 0;
for (const auto& s : shapes) {
s->draw();
total += s->area();
std::cout << "Area: " << s->area() << "\n";
}
std::cout << "Total area: " << total << "\n";
}

虚析构函数确保派生类正确析构。

class Base {
public:
Base() { std::cout << "Base constructed\n"; }
virtual ~Base() { std::cout << "Base destroyed\n"; }
};

class Derived : public Base {
int* data_;
public:
Derived() : data_(new int[100]) {
std::cout << "Derived constructed\n";
}
~Derived() override {
delete[] data_;
std::cout << "Derived destroyed\n";
}
};

void virtual_destructor_demo() {
Base* ptr = new Derived();
delete ptr;
}

dynamic_cast进行运行时类型转换。

void dynamic_cast_demo() {
std::vector> animals;
animals.push_back(std::make_unique());
animals.push_back(std::make_unique());

for (auto& animal : animals) {
if (Dog* dog = dynamic_cast(animal.get())) {
std::cout << "Found a dog\n";
} else if (Cat* cat = dynamic_cast(animal.get())) {
std::cout << "Found a cat\n";
}
}
}

typeid获取运行时类型信息。

void typeid_demo() {
std::unique_ptr animal = std::make_unique();
std::cout << "Type name: " << typeid(*animal).name() << "\n";
std::cout << "Is Dog: " << (typeid(*animal) == typeid(Dog)) << "\n";
std::cout << "Is Cat: " << (typeid(*animal) == typeid(Cat)) << "\n";
}

final关键字防止继承和重写。

class BaseFinal {
public:
virtual void func() final {
std::cout << "Cannot override\n";
}
};

多重接口继承。

class Printable {
public:
virtual ~Printable() = default;
virtual void print() const = 0;
};

class Serializable {
public:
virtual ~Serializable() = default;
virtual std::string serialize() const = 0;
};

class Document : public Printable, public Serializable {
std::string content_;
public:
explicit Document(const std::string& c) : content_(c) {}

void print() const override {
std::cout << content_ << "\n";
}

std::string serialize() const override {
return "DOC:" + content_;
}
};

void multiple_interface_demo() {
Document doc("Hello World");
doc.print();
std::cout << "Serialized: " << doc.serialize() << "\n";
}

协变返回类型。

class Cloneable {
public:
virtual Cloneable* clone() const { return new Cloneable(*this); }
};

class CloneableDerived : public Cloneable {
public:
CloneableDerived* clone() const override {
return new CloneableDerived(*this);
}
};

虚函数是实现运行时多态的基础,理解vtable机制有助于设计灵活的面向对象系统。

相关新闻

  • MC68HC908GZ ESCI模块深度解析:寄存器操作、波特率配置与调试实战
  • 2026年6月目前评价高的水帘除尘器制造厂家选哪家,喷淋塔除尘器/水帘除尘器/湿式除尘器,水帘除尘器批发厂家推荐 - 品牌推荐师
  • 2026年热门的义乌拼箱代理/义乌货运代理哪家专业 - 品牌宣传支持者

最新新闻

  • 深入解读MC13892 PMU动态特性与引脚设计:从参数到实践的电源管理指南
  • 网络安全攻防:从钓鱼网站与撞库攻击看身份认证保护策略
  • 泛型的定义,继承,通配符和综合练习(含笔记)
  • 大数据行业就业前景分析
  • 如何评估系统门窗十大品牌?靠谱生产商品牌解读 - myqiye
  • 深入解析MAC7200总线架构:AXBS与AIPS在嵌入式系统中的应用与调试

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号