c++第五节课 多态

1.多态

虚函数,多态的条件,纯虚函数,纯虚函数的特点抽象类,typeinfo运算符,RTT1机制,运算符重载

 

通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。 为了消除这种尴尬,让基类指针能够访问派生类的成员函数,C++ 增加了虚函数

(Virtual Function)。
 虚函数:    在函数声明前面增加 virtual 关键字。

使用虚函数:
基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),
指向派生类对象时就使用派生类的成员。

换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)

C++提供多态的目的是:
    可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。

派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;
而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。


A->B->C,A中声明虚函数

若C中没有display()函数,就去调用B中的display函数,如果B中没有display()函数就去A中调用display函数,如果A中没有那么就报错;



虚函数对于多态具有决定性的作用,有虚函数才能构成多态。

1) 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。

2) 为了方便,你可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽(覆盖)关系的同名函数都将自动成为虚函数。

3) 当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。
4) 只有派生类的虚函数遮蔽基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();,派生类虚函数的原型为virtual void func(int);,那么当基类指针 p 指向派生类对象时,语句p -> func(100);将会出错,而语句p -> func();将调用基类的函数。

5) 构造函数不能是虚函数。对于基类的构造函数,它仅仅是在派生类构造函数中被调用,这种机制不同于继承。也就是说,派生类不继承基类的构造函数,将构造函数声明为虚函数没有什么意义。

6) 析构函数可以声明为虚函数,而且有时候必须要声明为虚函数,如有的时候不调用声明为虚函数的析构函数就会发生内存泄露。


BaseA *p = new BaseA("zhou",20);
p->display();
p = new DerB("dong",11,90.5);
p->display();

基类Base A中有一个display(){cout<<m_name<<",year = "<<m_year<<",has no work"<<endl;};

派生类DerB中有一个disoplay(){cout<<m_name<<",age = "<<m_year<<",score is"<<m_socre<<endl;}

如果再基类Base A的display()前面没有加virtual声明虚函数,打印就是

zhou,20,has no work




2.纯虚函数

在C++中,可以将虚函数声明为纯虚函数,语法格式为:
virtual 返回值类型 函数名 (函数参数) = 0;
纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。
最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。
包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。

抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。






dong,11,has no work

如果再BaseA中display()前面加了virtual声明虚函数则打印是

zhou,year = 20,has no work

dong,age = 11,90.5

在基类中加virtual声明虚函数,那么基类指针(如BaseA *p = new BaseA("zhou",20);)就可以在指向基类对象(new BaseA("zhou",20);)的时候就可以访问基类的成员,在基类指针指向派生类的时候也可以访问派生类的成员

/
借助引用也可以实现多态:

当基类的引用指代基类对象时,调用的是基类的成员,而指代派生类对象时,调用的是派生类的成员。




///

多态的 条件:

a必须存在继承关系

b。继承中必须有同名的函数,并且也是遮蔽的关系

c存在基类指针。通过该指针调用虚函数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统,可以是移动应用、网页服务或集到智能农业设备。 7. **实时监测**:在实际应用,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值