纯虚函数(转)

本文详细介绍了纯虚函数的概念及其在C++中的应用,包括如何定义纯虚函数、为何引入纯虚函数以及与之相关的多态性和虚函数概念。此外还提供了具体的代码示例帮助理解。

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

一、定义.

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

virtual void funtion1()=0

二、引入原因:

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

三、相似概念:

1、多态性

指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。

a.编译时多态性:通过重载函数实现

b 运行时多态性:通过虚函数实现。

2、虚函数

虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载

3、抽象类

包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

程序举例:

基类:
class A 
{
public:
 A();
 void f1();
 virtual void f2();
 virtual void f3()=0;
 virtual ~A();

};

子类:
class B : public A 
{
public:
 B();
 void f1();
 void f2();
 void f3();
 virtual ~B();

};
主函数:
int main(int argc, char* argv[])
{
 A *m_j=new B();
 m_j->f1();
 m_j->f2();
 m_j->f3();
 delete m_j;
 return 0;
}

f1()是一个普通的重载.
调用m_j->f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.
也就是根据它是由A类定义的,这样就调用这个类的函数.
f2()是虚函数.
调用m_j->f2();会调用m_j中到底保存的对象中,对应的这个函数.这是由于new的B
对象.
f3()与f2()一样,只是在基类中不需要写函数现实.

图像处理入门教程:http://www.honeynight.com/read.php?tid=2905

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/Douglax/archive/2007/01/20/1488730.aspx

<think>我们正在讨论UVM中的纯虚函数。根据引用[2],抽象类和纯虚方法可以用于建立具有统一观感的测试平台。在SystemVerilog中,纯虚函数是在抽象类(或接口类)中声明但没有实现的函数,它们必须在派生类中被实现。 定义: - 纯虚函数使用关键字 `pure virtual` 声明,并且没有函数体。 - 包含纯虚函数的类被称为抽象类,不能直接实例化。 应用场景: 1. 定义接口规范:当多个组件需要遵循相同的接口但实现不同时,可以使用抽象类定义纯虚函数作为接口规范。例如,不同的总线适配器(adapter)可能需要实现相同的换任务,但具体实现因总线协议而异(如引用[4]中提到的adapter)。 2. 模板方法模式:在父类中定义算法的骨架,将一些步骤延迟到子类中实现,这些步骤就可以用纯虚函数表示。 示例: ```systemverilog virtual class abstract_adapter extends uvm_object; // 纯虚函数,用于将寄存器操作换为总线事务 pure virtual function uvm_sequence_item reg2bus(uvm_reg_bus_op rw); // 纯虚函数,用于将总线事务换为寄存器操作 pure virtual function void bus2reg(uvm_sequence_item bus_item, uvm_reg_bus_op rw); endclass // 具体适配器类 class my_bus_adapter extends abstract_adapter; // 实现纯虚函数 virtual function uvm_sequence_item reg2bus(uvm_reg_bus_op rw); // 根据具体总线协议实现换 my_bus_transaction trans = my_bus_transaction::type_id::create("trans"); trans.addr = rw.addr; trans.data = (rw.kind == UVM_READ) ? 0 : rw.data; trans.rw = (rw.kind == UVM_READ) ? READ : WRITE; return trans; endfunction virtual function void bus2reg(uvm_sequence_item bus_item, uvm_reg_bus_op rw); my_bus_transaction trans; if (!$cast(trans, bus_item)) begin `uvm_fatal("CAST", "Type mismatch") end rw.kind = (trans.rw == READ) ? UVM_READ : UVM_WRITE; rw.addr = trans.addr; rw.data = trans.data; rw.status = UVM_IS_OK; endfunction endclass ``` 在上面的例子中,`abstract_adapter`是一个抽象类,它定义了两个纯虚函数`reg2bus`和`bus2reg`。具体的适配器(如`my_bus_adapter`)必须实现这两个函数,以完成特定总线的换。 注意:抽象类不能被实例化,只能通过派生具体类来使用。 相关问题: 1. 在UVM中,抽象类和接口类有什么区别? 2. 如何确保一个派生类实现了所有纯虚函数? 3. 纯虚函数在UVM验证平台中的其他常见应用场景有哪些?</think>### UVM纯虚函数定义与应用场景 #### 定义 在UVM中,**纯虚函数(pure virtual function)** 是通过`pure virtual`关键字声明的抽象方法: ```systemverilog virtual class abstract_base extends uvm_object; pure virtual function void do_operation(); // 纯虚函数声明 endclass ``` 核心特征: 1. **无实现体**:只有声明没有具体实现 2. **强制实现**:派生类必须重写该方法 3. **抽象类约束**:包含纯虚函数的类自动成为抽象类(不可直接实例化) #### 应用场景 1. **接口标准化**(引用[2][4]) - 定义通用接口规范,强制子类实现协议相关细节 - 例如总线适配器(adapter)方法: ```systemverilog virtual class uvm_reg_adapter extends uvm_object; pure virtual function uvm_sequence_item reg2bus(uvm_reg_bus_op rw); pure virtual function void bus2reg(uvm_sequence_item bus_item, uvm_reg_bus_op rw); endclass ``` 具体适配器必须实现这些方法完成总线协议换[^4] 2. **模板方法模式** - 在父类定义算法框架,关键步骤留空: ```systemverilog virtual class base_test extends uvm_test; task run_phase(uvm_phase phase); pre_test(); // 具体方法 main_test(); // 纯虚方法 post_test(); // 具体方法 endtask pure virtual task main_test(); endclass ``` 3. **插件架构扩展** - 通过纯虚函数定义扩展点,支持后期功能扩展: ```systemverilog virtual class coverage_collector extends uvm_component; pure virtual function void sample_transaction(uvm_sequence_item item); endclass ``` #### 使用要点 1. **实现要求**:派生类必须实现所有纯虚函数,否则仍是抽象类 2. **多态调用**:通过基类指针调用实际执行派生类实现 3. **设计优势**: - 保证接口一致性(引用[2]) - 解耦接口定义与实现 - 支持验证平台的可扩展性(引用[3]) > 典型应用参考UVM源码中的`uvm_reg_adapter`(引用[4])和`uvm_comparator`等基础类,这些类通过纯虚函数定义了标准接口,具体实现由用户根据协议扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值