精华内容
下载资源
问答
  • 虚函数与纯虚函数

    2020-12-08 11:16:42
    虚函数与纯虚函数的区别 虚函数的作用 虚函数的作用基类的指针可以调用子类的该函数,虚函数在基类中必须要实现。 纯虚函数在基类中不需要实现,子类中必须实现该函数。 虚函数 #include <iostrem> using ...

    虚函数与纯虚函数的区别

    虚函数的作用

    虚函数的作用基类的指针可以调用子类的该函数,虚函数在基类中必须要实现。
    纯虚函数在基类中不需要实现,子类中必须实现该函数。

    虚函数

    #include <iostrem>
    using namespace std;
    
    class Animal {
    public:
        virtual void printClassName() {
            cout << "Animal" << endl;
        }   
    };
    
    class Dog:public Animal {
    public:
        void printClassName() {
            cout << "Dog" << endl;
        }   
    
    };
    
    int main() {
    
        Animal* ptr = new Dog();
        ptr->printClassName();// ptr虽然是指向Animal的指针,但调用的Dog中printClassName()
        return 0;
    }
    

    纯虚函数

    为什么要用纯虚函数

    很多情况下父类生成的对象是不合理的,比如动物类作为父类,可以派生出狗、老虎、狮子等子类,用动物类实例化一个对象不合理。

    定义

    纯虚函数在父类中没有实现,在子类中要实现。
    其在父类中的格式为:virtual returnType funcName(参数) = 0;

    展开全文
  • C++虚函数与纯虚函数和多态1.多态多态,按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的...

    C++虚函数与纯虚函数和多态

    1.多态

    多态,按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。

    多态特性是C++中重要的特性之一,在多态中,引用和指针的静态类型和动态类型可以是不同的,这是C++支持多态的基石。通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的确切类型是什么,执行函数的类型可能是基类类型的,也可能是派生类型的。

    如果调用的是非虚函数,那么无论对象是什么类型的,都会执行基类类型所定义的函数。如果调用虚函数,则直到运行时,才能确定调用了哪个类型的函数,运行的虚函数是引用所绑定的或指针所指向的对象所属的类型定义的版本。

    从代码的角度来看,我们无需担心。只要正确的设计了类和函数,不管实际操作对象是基类类型的,还是派生类类型的,都将正确的工作。

    2.C++虚函数

    上段内容中,提到了实现多态的方式--虚函数,虚函数只是其中的一种,在C++中,除了虚函数,实现多态的方式还有抽象类,覆盖,模版等。这里详细的说下虚函数的工作方式,其他不予以说明。下面来一个比较经典的关于虚函数的例子:

    1: class A

    2: {

    3: public:

    4:     virtual void foo()

    5:     {

    6:         cout<

    7:     }

    8: };

    9: class B:public A

    10: {

    11: public:

    12:     void foo()

    13:     {

    14:         cout<

    15:     }

    16: };

    17: int main(void)

    18: {

    19:     A *a = new B();

    20:     a->foo();   // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!

    21:     return 0;

    22: }

    看了上面的代码,读者应该大概的理解了虚函数的作用,在派生类中,允许定义与基类同名的函数,即重写基类函数,也可以说是覆盖(override),并且可以通过基类指针或引用,调用基类和派生类中的同名的函数。

    3.纯虚函数

    纯虚函数,其实并无什么特别的意义。拿下面这个例子来说:

    1: class 动物 {

    2:        virtual void miao() { 这里我应该写什么? }

    3: }

    4: class 猫: 动物{  xxx }

    5: class 狗: 动物{ xxx  } 这个类是动物,我们现在需要做的是让不同的动物都要做一个发出叫声的动作。 代码中应该写什么呢?因为并没有叫“动物”这种动物,所以“动物”是没有叫声的;另外,动物* a = new 动物; // 这代表了什么 ?没有 "动物" 这种 动物,你 new 猫 或者 new 狗都可以理解,但是 new 动物 表示什么 ?所以,C++引入了一个“纯虚”的标识。

    class 动物 {

    virtual miao() = 0; // 函数后面写 =0

    }

    =0 就表示这个函数是“纯虚函数”,意思是“没有什么意义的函数”,你不需要写函数体,如果某个类, 里面有 任意一个 纯虚函数存在, 那么这个类就是 "纯虚类","纯虚类" 只有 一个 特点.那就是不能声明对象,如果你要是new对象的话,那么编译器会给你一个 error..

    对于纯虚类,C++primer 书中是这么给出的定义:

    含有(或继承)一个或多个纯虚函数的类是 抽象基类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。

    关于虚函数,纯虚函数和多态就说这么多,如有错误,欢迎指正。

    展开全文
  • C++的类要实现多态,不像java,直接就有,而是需要给...虚函数如上面所说的,加上virtual即可,因为不是纯虚函数,所以也同样需要提供函数的定义纯虚函数除了同样必须要有virtual关键字外,函数的定义不是必须的,...

    C++的类要实现多态,不像java,直接就有,而是需要给函数前面带上virtual,所以java的成员函数从c++角度来说的话都是虚函数。

    再基类指针或引用指向派生类的时候,调用虚函数,就会在运行时判断并采用真实对象的函数实现,而不是基类的。

    虚函数

    如上面所说的,加上virtual即可,因为不是纯虚函数,所以也同样需要提供函数的定义

    纯虚函数

    除了同样必须要有virtual关键字外,函数的定义不是必须的,纯虚函数就是在声明时加上=0即可,如过想要带上定义,那只能把定义放到外面。如

    class A {

    public:

    virtual void print() = 0;

    }

    void A::print() {

    cout << 123 << endl;

    }

    含有纯虚函数的类是属于抽象类,是不能用他们直接创建对象的,如果要在派生类中调用基类的方法,则采用A::print()的形式。

    析构函数(虚/纯虚?)

    在继承的情况下,对于一个派生类对象的实例,他的正常销毁是需要从派生类的析构函数开始,一直向上调用各级父类的析构函数。

    如果类中包含虚函数,那么析构函数最好也声明为虚函数,因为如果不然,在delete一个基类的指针时,就会无法调用到派生类的析构函数,就可能出现问题。

    而如果析构函数是虚函数,我们也一般不会把它定义为纯虚函数,因为和其它函数不同,编译器要求析构函数必须要有定义(而纯虚函数可以没有函数定义/函数体),这样销毁对象时才能有东西调用。如果非要定义为纯虚函数,那么需要给它提供函数定义。

    展开全文
  • 本篇文章是对虚函数与纯虚函数进行了详细的分析介绍,需要的朋友参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,510
精华内容 604
关键字:

虚函数与纯虚函数