【C++】虚函数

来自:黄邦勇帅

 

1.注意不能把成员变量声明为虚有的,也就是说 virtual 关见字不能用在成员变量前面。

2.一般应使用基类指针来调用虚函数,如果用点运算符来调用虚函数就失去了它的意义.

3.重定义虚函数时不需再使用virtual 关见字,当然也可以继续标明 virtual 关见字

4.虚函数的类被称为多态类.C++使用虚函数支持多态性.

5.一旦将函数声明为虚函数,则不管它通过多少层继承,它都是虚函数

6.隐藏虚函数:如果基类定义了一个 虚函数 ,但派生类中 却定义了一个虚函数的重载板本,则派生类的这个版本就会把基类的虚函数隐藏掉,当使用基类 指针调用该函数时只能调用基类的虚函数,而不能调用派生类的重载版本,当用派生类的对象调用基类的 虚函数时就会出现错误了 ,因为基类的虚函数被派生类的重载版本隐藏了。

7.如果虚函数形参有默认值,那么派生类中的虚数的形参不论有无默认值,当用指针调用派生类中的虚函数时就会被基类的默认值覆盖,即派生类的 默认值不起作用。但用派生类的对象调用该函数时,就不会出现这种情况。

8.析构函数可以是虚函数,但构造函数不能

9.纯虚函数声明形式为 virtual 类型 函数名(参数列表)=0;注意后面的 等于0;

10.如果类至少有一个纯虚函数,则这个类就是抽象的。

11.任何派生类都必须实现纯虚函数的自已的版本. 如果不实现纯虚函数那么该类也是抽象类。

12.抽象类不能有对象,抽象类只能用作其它类的基类

13.仍然可以用抽象类声明一个指针,这个指针指向派生类对象.

14.虚函数虚拟特性是以层次结构的方式来继承的,例如C从B派生而且C中重定义了B中的虚函数,而D又从C派生且未重定义B中的虚函数,这时声明一个基类指针P,当P指向类D,并调用D中的虚函数时,由于D中未重定义虚函数他会调用基类中的虚函数版本,这时他会调用类C中的虚函数而不是类B中的虚函数,因为类C比类B更接近于类D.

 

对于第7点,例子如下:

#include<iostream>
using namespace std;

class A
{
public:
    virtual void fun(int i = 9)
    {
        cout << "A fun" << endl;
        x = i;
    }
    int x;
};

class B:public A
{
public:
    void fun(int i = 8)
    {
        cout << "B fun" << endl;
        x = i;
    }
};

int main()
{
    B b;
    B *pb = new B;
    A *pa = new B;
    b.fun();
    cout << b.x << endl;  // 8
    cout << "-----------------" << endl;
    pb->fun();
    cout << pb->x << endl; // 8
    cout << "-----------------" << endl;
    pa->fun();
    cout << pa->x << endl; // 9 这时,派生类虚函数里的参数默认值无效
    cout << "-----------------" << endl;
    return 0;
}

 

posted @ 2015-09-06 15:27  匡子语  阅读(316)  评论(0编辑  收藏  举报