首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++多态的传递性和虚函数的重载之重写的虚函数还可以是虚函数

C++多态的传递性和虚函数的重载之重写的虚函数还可以是虚函数

作者头像
码事漫谈
修改2025-01-16 14:32:16
修改2025-01-16 14:32:16
2520
举报
文章被收录于专栏:设计模式设计模式

万古教员有名言,自信人生二百年。 个人主页:oioihoii 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞

C++的多态特性是面向对象编程中的一个重要概念,它允许我们将子类对象当作父类对象来使用。这种特性的实现主要依赖于虚函数和虚函数表。

代码示例

代码语言:javascript
复制
#include <iostream>
class Base {
public:
	virtual void foo() {
		std::cout << "Base::foo()" << std::endl;
	}
};

class DerivedBase : public Base {
public:
	virtual void foo() override {
		std::cout << "DerivedBase::foo()" << std::endl;
	}
};

class Derived : public DerivedBase {
public:
	void foo() override {
		std::cout << "Derived::foo()" << std::endl;
	}
};

int main() {
	Base* b = new Derived();
	b->foo();  // 输出 "Derived::foo()"
	delete b;
	return 0;
}

多态的传递性

在C++中,多态是可以传递的。也就是说,如果一个类是另一个类的子类,那么这个类的对象也可以当作父类的对象来使用。这种传递性不仅适用于直接的父类和子类,也适用于更远的祖先类和后代类。

在下面的代码中,Derived类是DerivedBase类的子类,而DerivedBase类又是Base类的子类。因此,我们可以将Derived对象当作Base对象来使用。

代码语言:javascript
复制
Base* b = new Derived();
b->foo();  // 输出 "Derived::foo()"

当我们创建一个Derived对象并将其赋值给Base指针b时,b的虚函数指针指向的是Derived类的虚函数表。因此,当我们通过b调用foo函数时,实际上调用的是Derived类的foo函数。

这就是多态的传递性。虽然b的类型是Base*,但是它实际上指向的是Derived对象,因此调用的是Derived类的foo函数。

虚函数的重载

在C++中,虚函数可以在子类中被重载。也就是说,子类可以提供一个与父类虚函数同名的函数,这个函数将覆盖父类的虚函数。

在上述代码中,Derived类、DerivedBase类和Base类都有一个名为foo的虚函数。当我们通过Base指针调用foo函数时,实际上调用的是Derived类的foo函数,因为Derived类的foo函数覆盖了Base类的foo函数。

代码语言:javascript
复制
void Derived::foo() {
    std::cout << "Derived::foo()" << std::endl;
}

这就是虚函数的重载。通过重载虚函数,子类可以改变父类虚函数的行为。

结论

C++的多态特性和虚函数的重载为我们提供了强大的工具,使我们可以编写出更灵活、更易于维护的代码。理解这些概念,可以帮助我们更好地使用C++,编写出更高质量的代码。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
  • 多态的传递性
  • 虚函数的重载
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档