C++ 动态特性

本文深入探讨了C++中动态特性的核心概念,包括虚函数和抽象基类的作用,解释了如何通过这些特性实现程序的可扩展性和灵活性。文章详细阐述了虚函数的声明与覆盖机制,以及抽象基类如何促进接口与实现的分离,为开发者提供了一套强大的设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在绝大多数情况下,程序的功能是在编译的时候就确定下来的,我们称为静态特性。反之,如果程序的功能是在运行时刻才确定下来的,则称为动态特性。

      动态特性是面向对象语言最强大的功能之一,因为它在语言层面上支持程序的可扩展性,而可扩展性是软件设计追求的重要目标之一。

     c++虚函数、抽象基类、动态绑定、多态构成了出色的动态特性。

     1.虚函数

       假定几何形状的基类为Shape,其派生类有Circle、Rectangle、Ellipse等,每个派生类都能够绘制自己所代表的形状。不管派生类的形状如何,我们希望用统一的方式来调用绘制函数,最好是使用Shape定义的接口函数Draw(),并让程序在运行是动态地确定应该使用哪一个派生类的Draw()函数。

     为了使这种行为可行,我们把基类Shape中的函数Draw()声明为虚函数,然后在派生类中重新定义Draw()使之绘制正确的形状,这种方法叫覆盖,虚函数的声明方法是在基类的函数原型之前加上关键之virtual。

     一旦类的一个函数被声明为虚函数,那么其派生类的对应函数也自动成为虚函数,这样一级一级传递下去。

    2.抽象基类

      当我们把类看成是一种数据类型时,通常会认为该类肯定是要被实例为一个或多个对象的。但是在很多情况下,定义那些不能实例化出对象的类也是很有用的,这种类就称为抽象类。抽象类的唯一目的就是让其派生类继承并实现它的接口方法,因此它通常也被称为抽象基类。

      如果将基类的虚函数声明为春虚函数,那么该类就被定义为了抽象基类。純虚函数是在声明时将其“初始化”为0的函数,例如:

      class Shape {                                  //Shape是抽象基类

      public:

                virtual void Draw(void)=0;  //Draw()为純虚函数

       }

      抽象基类Shape的純虚函数Draw()根本不知道自己应该怎么绘制出一个“形状”来,具体功能必须有代表具体形状的派生类对应的Draw()函数来实现。

      我们知道,函数名就是函数的地址,将一个函数初始化为0意味着函数的地址将为0,这就是在告诉编译器,不要为该函数编址,从而阻止该类的实例化行为。

      抽象基类的主要用途是“接口与实现分离”;不仅要把数据成员(信息)隐藏起来,而且还要把实现完全隐藏起来,只留一些接口给外部调用。

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值