`

虚函数、纯虚函数详解

 
阅读更多
虚函数:父类中有虚函数,如果子类实例以父类的身份出现,那么调用虚函数的时候就会是子类的实现,而不是父类的实现,如果是普通方法,那么将会调用父类的实现



1.首先:强调一个概念 
       定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
       定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。 

2.关于实例化一个类: 
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如: 
class CA 
{ 
public: 
    virtual void fun() = 0;  // 说明fun函数为纯虚函数 
    virtual void fun1(); 
}; 

class CB 
{ 
public: 
   virtual void fun(); 
   virtual void fun1(); 
}; 

// CA,CB类的实现 
... 

void main() 
{ 
    CA a;   // 不允许,因为类CA中有纯虚函数 
    CB b;   // 可以,因为类CB中没有纯虚函数 
    ... 
} 
 
3.虚函数在多态中间的使用: 
   多态一般就是通过指向基类的指针来实现的。 

4.有一点你必须明白,就是用父类的指针在运行时刻来调用子类: 
例如,有个函数是这样的: 
void animal::fun1(animal *maybedog_maybehorse) 
{ 
     maybedog_maybehorse->born();
} 
 

参数maybedog_maybehorse在编译时刻并不知道传进来的是dog类还是horse类,所以就把它设定为animal类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。

5.用虚函数 
#include <iostream.h> 

class animal 
{ 
public: 
     animal(); 
     ~animal(); 
     void fun1(animal *maybedog_maybehorse); 
     virtual void born(); 
}; 

void animal::fun1(animal *maybedog_maybehorse) 
{ 
     maybedog_maybehorse->born(); 
}

animal::animal() { } 
animal::~animal() { } 
void animal::born() 
{ 
     cout<< "animal"; 
} 
///////////////////////horse
class horse:public animal 
{ 
public: 
     horse(); 
     ~horse(); 
     virtual void born(); 
}; 

horse::horse() { } 
horse::~horse() { } 
void horse::born()
{ 
     cout<<"horse"; 
} 
///////////////////////main
void main() 
{ 
     animal a; 
     horse b; 
     a.fun1(&b); 
} 

//output: horse
 

6.不用虚函数 
#include <iostream.h> 
class animal 
{ 
public: 
     animal(); 
     ~animal(); 
     void fun1(animal *maybedog_maybehorse); 
     void born(); 
}; 

void animal::fun1(animal *maybedog_maybehorse) 
{ 
     maybedog_maybehorse->born(); 
} 

animal::animal() { }
animal::~animal() { } 
void animal::born() 
{ 
     cout<< "animal"; 
} 
////////////////////////horse
class horse:public animal 
{ 
public: 
     horse(); 
     ~horse(); 
     void born(); 
}; 

horse::horse() { } 
horse::~horse() { } 
void horse::born()
{ 
     cout<<"horse"; 
} 
////////////////////main
void main() 
{ 
     animal a; 
     horse b; 
     a.fun1(&b); 
} 
//output: animal
 
分享到:
评论

相关推荐

    c++纯虚函数的用法及详解

    ### C++纯虚函数的用法及详解 #### 一、引言 在学习C++的过程中,虚函数是一个重要的概念,特别是在实现多态性时。本文将深入探讨纯虚函数的概念及其在C++中的应用。 #### 二、C++中的多态与虚函数 在C++中,多...

    Java与C++在虚函数,纯虚函数上的区别

    ### Java与C++在虚函数、纯虚函数上的区别详解 #### Java的抽象函数与C++的虚函数 在深入探讨两者之间的差异之前,我们先理解一下Java与C++各自如何处理多态性,尤其是通过虚函数和抽象函数实现。 **Java**中,...

    C++中的虚函数和纯虚函数用法(ZT)

    ### C++中的虚函数与纯虚函数详解 #### 一、引言 在面向对象编程中,多态性是一项非常重要的特性,它允许程序通过基类指针或引用调用派生类的方法。C++中实现多态性的主要机制之一就是虚函数。虚函数和纯虚函数是...

    多态性与虚函数习题

    ### 多态性与虚函数知识点详解 #### 一、多态性概念 **多态性**是面向对象编程中的一个重要特性,它允许子类对象替换父类对象,从而达到程序设计的高度灵活性。C++中多态性的实现主要依赖于虚函数机制。 #### 二...

    c++虚函数的使用

    1. **纯虚函数**:如果一个基类只声明不定义虚函数,那么这个函数就是纯虚函数,用`= 0`表示。例如: ```cpp class Base { public: virtual void print() = 0; }; ``` 这样的类不能被实例化,但可以作为其他...

    C++ 虚函数的详解及简单实例

    C++ 虚函数的详解 虚函数的使用和纯虚函数的使用。 虚函数是在基类定义,然后子类重写这个函数后,基类的指针指向子类的对象,可以调用这个函数,这个函数同时保留这子类重写的功能。 纯虚函数是可以不用在基类定义...

    c++多态性与虚函数练习题

    ### C++多态性与虚函数知识点解析 #### 一、多态性的概念 多态性是面向对象编程的一个核心特性,它允许我们通过基类的接口来操作派生类的对象。这种特性使得代码更加灵活且易于扩展。在C++中,多态性主要通过虚函数...

    C++ 纯虚函数

    ### C++纯虚函数详解 #### 一、纯虚函数定义及作用 纯虚函数是C++中一种特殊的虚函数,它在基类中声明但不提供具体的实现,其主要目的是为派生类提供一个必须重写的接口。通过在基类中声明纯虚函数,可以确保所有...

    虚函数概念用法的小程序

    ### 虚函数概念与用法详解 #### 引言 在C++编程语言中,虚函数(Virtual Function)是一种非常重要的特性,它为面向对象编程中的多态性提供了支持。通过虚函数,子类可以重写父类的方法,使得在运行时能够根据对象...

    详解C++纯虚函数与抽象类

    详解C++纯虚函数与抽象类 C++中的虚函数和抽象类是两个非常重要的概念,它们在面向对象编程中扮演着主要角色。在本文中,我们将详细介绍C++中的虚函数和抽象类,帮助大家更好地理解和学习C++。 虚函数 ------ 虚...

    c++多态性与虚函数习题答案.pdf

    **C++多态性和虚函数知识点详解** C++语言提供了两种多态性,分别是编译时多态性和运行时多态性。编译时多态性主要通过函数重载和模板来实现,编译器在编译阶段就能确定调用哪个函数。而运行时多态性则依赖于虚函数...

    详解C++编程中的虚函数

    3. **虚函数表**:C++实现虚函数调用依赖于虚函数表(Vtable),每个包含虚函数的类都有一个虚函数表,记录了类中虚函数的地址。 4. **构造函数与析构函数**:C++标准规定构造函数不能是虚函数,但析构函数默认是虚...

    深入解析C++编程中的纯虚函数和抽象类

    C++纯虚函数详解 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。 纯虚函数是在声明虚函数时被“初始化”为0...

    c++多态和虚函数表

    // 纯虚函数 }; // 派生于Vehicle的具体类Car class Car : public Vehicle { public: virtual void run() const override { std::cout ; } }; // 派生于Vehicle的具体类Airplane class Airplane : public ...

    C++ 中const修饰虚函数实例详解

    在这个例子中,`Base`类声明了一个纯虚函数`print()`,并被`const`修饰。这意味着任何继承自`Base`的类都必须提供一个不会改变对象状态的`print()`实现。`Test`类继承了`Base`,但只提供了非`const`版本的`print()`...

    Part7-多态与虚函数-KEY.pdf

    2. 纯虚函数:纯虚函数是一种特殊的虚函数,用`=0`来声明,没有函数体。含有纯虚函数的类被称为抽象类,抽象类不能被实例化,只能作为其他类的基类。派生类必须为基类中的纯虚函数提供实现,除非它也是一个抽象类。 ...

    tlb.rar_.tlb_TlB_虚函数接口

    标题中的“tlb.rar_.tlb_TlB_虚函数接口”揭示了这个压缩包的核心内容,即它包含有关TLB文件以及其与虚函数接口的关联信息。 **TLB 文件的定义** TLB文件是COM组件的接口库,它存储了COM对象的接口定义、方法、属性...

Global site tag (gtag.js) - Google Analytics