纯虚函数 注意有红色的部分

本文通过具体的代码示例介绍了C++中虚函数和纯虚函数的应用。包括如何定义虚函数作为基类接口,并在派生类中实现具体功能;以及如何使用纯虚函数创建抽象基类来强制派生类实现特定的方法。

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

虚函数的例子。
#include  <iostream.h>
class figure {                                 //定义一个公共基类
      protected:
          double  x,y;
      public:
          figure(double a, double b)  { x=a; y=b; }
          virtual void show_area()  //定义一个虚函数,作为界面接口
       { cout<<"No area computation defined for this class./n"; }
};
class  triangle:public  figure{      //定义派生类三角形
       public:
           triangle(double a, double b):figure(a,b)  {    };
        void show_area()         //虚函数重新定义,求三角形的面积
        {   cout <<"三角形的高="<< x <<" 三角形的底="<<y<<endl; 
             cout<<"三角形的面积="<< x*y*0.5<<endl;
        }
};
class  square:public  figure{         //定义派生类矩形
       public:
           square(double a, double b):figure(a,b)  {    };
           void show_area()         //虚函数重新定义,求矩形的面积
           {  cout <<"矩形的长="<< x <<"    矩形的宽="<<y<<endl; 
               cout<<"矩形的面积="<< x*y<<endl;
           }
};
class  circle:public  figure{         //定义派生类圆
       public:
           circle(double a):figure(a,a)  {    };
           void show_area()         //虚函数重新定义,求圆的面积
           {  cout <<"圆的半径="<< x; 
               cout<<"    圆的面积="<< x*x*3.1416<<endl;
           }
};
void  main()
{ figure  *p;                              //定义基类的指针 p
    triangle  t(10.0,6.0);            //定义三角形类对象 t
    square   s(10.0,6.0);           //定义矩形类对象 s
    circle c(10.0);                        //定义圆类对象 c
    p=&t;
    p->show_area();                 //计算三角形面积
    p=&s;
    p->show_area();                 //计算矩形面积
    p=&c;
    p->show_area();                 //计算圆面积

}
纯虚函数的例子。
#include<iostream.h>
class circle{
       protected:
               int r;
       public:
               void setr(int x)   {r=x;}
               virtual  void show(  )=0;                   //纯虚函数
};
class area:public circle {
          public:
               void show (  )                       //重新定义虚函数 show (  )
                {cout<<"面积是:"<< 3.14* r* r<<endl;}
};
class perimeter:public circle{
           public:
               void show (  )                       //重新定义虚函数 show (  )
                {cout<<"周长是:"<<2*3.14*r<<endl;}
};
void main(  )
{   circle      *ptr;
     area ob1;            perimeter ob2;
     ob1.setr(10);      ob2.setr(10);
     ptr=&ob1;           ptr->show(  );
     ptr=&ob2;           ptr->show(  );
}

<think>好的,我现在要回答用户的问题:“纯虚函数可以有函数体吗?”首先,我需要回忆一下C++中关于纯虚函数的相关知识。 纯虚函数通常在基类中声明,用来定义接口,要求派生类必须实现。它们的声明方式是在函数声明的末尾加上“= 0”。比如 virtual void func() = 0;。这时候,基类就成了抽象类,不能实例化。 但是,用户问到纯虚函数是否可以有函数体。我记得在某些情况下,纯虚函数是可以有实现的,虽然这并不常见。这可能是在基类中提供默认的实现,而派生类可以选择是否调用它。例如,在基类的纯虚函数中提供一些通用的代码,派生类通过显式调用基类的版本。 需要确认这一点是否正确。根据C++标准,纯虚函数可以拥有函数体,但派生类仍然必须重写该函数,否则派生类也会成为抽象类。不过,当派生类重写后,可以通过基类名来调用基类的纯虚函数实现。这可能用于某些设计模式,比如模板方法模式,基类提供部分实现,派生类补充剩余部分。 举个例子,比如基类中的纯虚函数定义了一个算法框架,其中某些步骤由派生类实现。这时候基类的纯虚函数可能有默认的行为,但强制派生类必须覆盖它,但允许在必要时调用基类的版本。 接下来需要整理这个回答的结构,首先明确回答用户的问题:是的,纯虚函数可以有函数体。然后解释为什么,如何实现,以及使用场景。最后给出示例代码。 然后,在相关问题部分,可能需要包括纯虚函数的作用、抽象类的定义、派生类必须实现纯虚函数的原因,以及纯虚析构函数的情况等。</think><< 纯虚函数可以有函数体。虽然这在语法上是合法的,但在实际应用中较为少见。以下是具体说明: 1. **语法规则** 在C++中,纯虚函数通过`= 0`标记定义,但依然可以单独为其编写函数体: ```cpp class Animal { public: virtual void speak() = 0; // 纯虚函数声明 }; // 在类外实现纯虚函数 void Animal::speak() { std::cout << "Base animal sound" << std::endl; } ``` 2. **调用方式** 派生类必须重写纯虚函数,但可通过作用域运算符显式调用基类实现: ```cpp class Dog : public Animal { public: void speak() override { Animal::speak(); // 调用基类纯虚函数实现 std::cout << "Woof!" << std::endl; } }; ``` 3. **使用场景** - 为派生类提供默认实现(派生类可选择是否调用) - 实现模板方法设计模式(框架逻辑由基类定义,细节由派生类补充) **原因**:C++标准允许纯虚函数定义函数体,这种设计增强了接口的灵活性,允许基类在强制派生类实现接口的同时,仍然提供可选的公共基础功能。 >>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值