纯虚函数也可定义!

今天,我读到《effective c++》的第34条款,里面竟然提到纯虚函数也是可以定义的,大吃一惊,赶快打开vs2005,自己编写了一段代码,编译运行,发现竟然真的可以!

俺的代码:

 

运行结果:

I'am pureVirtualFunc
I belong to B!请按任意键继续. . .

 

原来抽象类是可以对纯虚函数进行定义的,在其子类中也是可以使用抽象父类的缺省实现!这一切对我来说显得这么突然!好像腿脚一软,站不稳了!是的,以前天天啃个不停个的教材竟然存在如此偏差!等等!好像教材里也没错!里面并没有说“不能”进行函数实现,而是根本就没有提到要去实现。所以老师和天真的我们都默认为不能实现咯!

在此我深深感悟到,目光短浅和学无止境的真正含义了!

<think>好的,我现在要回答用户关于C++中纯虚函数和虚函数是否必须定义以及它们的使用规则的问题。首先,我需要回忆一下相关的知识点,并结合提供的引用内容来组织答案。 用户的问题主要集中在两个方面:是否必须定义,以及使用规则。根据引用中的信息,虚函数在基类中通常有默认实现,而纯虚函数在基类中没有实现,派生类必须重写纯虚函数。此外,包含纯虚函数的类称为抽象类,不能实例化。 首先,我需要明确虚函数和纯虚函数定义和区别。虚函数用virtual关键字声明,基类可以提供实现,派生类可以选择是否重写。纯虚函数则是通过在声明后加=0来定义,基类不提供实现,派生类必须重写,否则也会成为抽象类,无法实例化。 接下来,回答是否需要定义的问题。对于虚函数,基类中必须提供定义,除非它是纯虚的。但根据引用内容,虚函数通常有默认实现,所以基类中的虚函数是需要定义的。而纯虚函数在基类中不定义,但C++11之后允许为纯虚函数提供定义,不过派生类仍然必须重写它。这点可能需要确认,但根据引用[2],纯虚函数基类不提供实现,所以可能用户提供的引用中没有提到C++11的特性,这里可能需要根据引用内容来回答,即纯虚函数基类不定义。 然后是关于使用规则。需要说明虚函数和纯虚函数在派生类中的重写规则,以及抽象类的概念。例如,含有纯虚函数的类是抽象类,不能创建对象,派生类必须实现所有纯虚函数才能实例化。 还需要检查是否有例外情况,比如纯虚函数在基类中是否有定义的可能,但根据引用内容,可能用户的信息是旧的,或者根据C++标准的不同版本,这里可能需要指出通常情况,但根据提供的引用,引用[2]明确说纯虚函数基类不提供实现,所以应遵循这一点。 另外,要确保回答结构清晰,分点说明虚函数和纯虚函数定义、使用规则上的不同,并给出示例代码,可能的话。同时需要生成相关问题,如应用场景、区别、设计模式中的使用等。 最后,确保回答符合用户的要求,使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少的数学公式,更多是代码示例。同时要添加引用标记到对应的引用内容,比如引用[^1]和[^2]。 现在需要将这些思考整理成结构化的回答,确保覆盖用户的疑问,并符合系统级指令的要求。</think>### 虚函数和纯虚函数定义与使用规则 #### 1. **虚函数(Virtual Function)** - **必须定义**:基类中的虚函数**必须提供定义**(除非声明为纯虚函数)。派生类可以选择是否重写该函数。若未重写,则默认使用基类实现[^2]。 - **使用规则**: - 使用`virtual`关键字声明,基类提供默认实现。 - 派生类可通过`override`关键字显式重写(C++11起支持)。 - 支持动态绑定,通过基类指针或引用调用时,实际执行派生类重写的版本。 **示例**: ```cpp class Shape { public: virtual void draw() { // 基类虚函数必须定义 std::cout << "Drawing a shape." << std::endl; } }; class Circle : public Shape { public: void draw() override { // 可选择性重写 std::cout << "Drawing a circle." << std::endl; } }; ``` --- #### 2. **纯虚函数(Pure Virtual Function)** - **无需在基类定义**:纯虚函数在基类中**不提供实现**(但C++11后允许提供可选定义)。派生类**必须重写**,否则派生类仍为抽象类,无法实例化[^2]。 - **使用规则**: - 使用`virtual 函数名() = 0;`声明。 - 包含纯虚函数的类称为**抽象类**,不能直接创建对象。 - 派生类必须实现所有纯虚函数才能实例化。 **示例**: ```cpp class Shape { public: virtual void draw() = 0; // 纯虚函数,基类不定义 }; class Circle : public Shape { public: void draw() override { // 必须重写 std::cout << "Drawing a circle." << std::endl; } }; ``` --- #### 3. **核心区别总结** | 特性 | 虚函数 | 纯虚函数 | |---------------------|---------------------------------|-----------------------------------| | **基类实现** | 必须提供默认实现 | 不提供实现(除非C++11显式定义) | | **派生类重写要求** | 可选 | 必须重写 | | **类类型** | 普通类 | 抽象类(不能实例化) | | **设计目的** | 提供可扩展的默认行为 | 强制接口规范 | --- #### 4. **使用场景** - **虚函数**:适用于基类有默认逻辑,但允许派生类自定义的场景(如通用算法框架)[^1]。 - **纯虚函数**:用于定义接口规范(如插件架构、策略模式),确保派生类实现关键功能[^2]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值