首页 > 编程 > C++ > 正文

C++ virtual函数重点

2019-11-08 02:42:54
字体:
来源:转载
供稿:网友

虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数,虚函数只能借助于指针或者引用来达到多态的效果。

虚函数的语法:

1:class A{public:    virtual void foo();};class B: public A{public:    void foo();    // 没有virtual关键字!};class C: public B  // 从B继承,不是从A继承!{public:    void foo();    // 也没有virtual关键字!};    这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字

2:纯虚函数:

一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

3:纯虚构函数:

 当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。

4:虚构造函数:

 构造函数不能是虚的

5:虚函数使用技巧:

5.1:class A{public:    void foo() { bar();}PRivate:    virtual void bar() { ...}};class B: public A{private:    virtual void bar() { ...}};    在这个例子中,虽然bar()在A类中是private的,但是仍然可以出现在派生类中,并仍然可以与public或者protected的虚函数一样产生多态的效果。并不会因为它是private的,就发生A::foo()不能访问B::bar()的情况,也不会发生B::bar()对A::bar()的override不起作用的情况。这种写法的语意是:A告诉B,你最好override我的bar()函数,但是你不要管它如何使用,也不要自己调用这个函数。

5.2:构造函数和析构函数中的虚函数调用 

一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:class A{public:    A() { foo();}        // 在这里,无论如何都是A::foo()被调用!    ~A() { foo();}       // 同上    virtual void foo();};class B: public A{public:    virtual void foo();};void bar(){    A * a = new B;    delete a;}    如果你希望delete a的时候,会导致B::foo()被调用,那么你就错了。同样,在new B的时候,A的构造函数被调用,但是在A的构造函数中,被调用的是A::foo()而不是B::foo()。

参考:http://blog.csdn.net/bao_jinyu/article/details/7843275


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选