c++虚函数、纯虚函数、普通函数、抽象类

1、虚函数

  虚函数是类的一种特殊成员函数,主要是为实现C++的多态特性引入。

    虚函数之所以“虚”是因为调用的虚函数不是在静态编译(静态编联)时确定,而是在运行时通过动态编联确定的。

    多态核心理念即是通过基类访问派生的子类,通常情况是借助基类指针来访问派生类对象。

    Note:

 1)析构函数通常声明为虚函数,这样在有继承场合,可以做到基于对象类型动态调用正确对象类型的析构函数,完成相应的对象析构。

 2)友元函数不是成员函数,只有成员函数才能是虚函数,所以友元函数不能是虚函数;但是友元函数可以通过调用成员虚函数达到虚拟化效果。

 3)通过虚函数可以实现多态灵活,但是虚函数也有缺点如占用更多内存(虚表),运行效率低(需要查找虚表找到正确函数)。

 4)通常普通函数(非成员函数)和类中不能继承(只属于本类)的函数(构造函数/static成员函数/inline成员函数/友元函数)不能声明为虚函数;不能声明为虚函数的函数共同点基本都是静态编联,而虚函数要靠动态编联机制才能起作用。

5)虚函数被继承后仍为虚函数。

2、纯虚函数

  纯虚函数是一种特殊的虚函数,通常定义在基类中。纯虚函数在基类中定义方法是在函数声明末尾加“=0”,如 virtual func(int, int) = 0。

扫描二维码关注公众号,回复: 3154902 查看本文章

    纯虚函数的“纯”体现为基类不需要实现它,其主要作用是为派生类定义函数接口框架,由派生类完成纯虚函数的实现。

一般地,我们不希望纯虚函数的构造函数暴露。所以我们把构造函数设为 protected

class test {
    int property1;
    int attribute2;
    virtual string toString() = 0;
protected:
    test() {}
    test(int p1, int p2) {
        property1 = p1;
        attribute2 = p2;
    }
};

1)纯虚函数被继承后为虚函数 

2)重载函数虽同名,但其实是不同的函数,我们让其中一种成为虚函数或者纯虚函数,其它的同名函数(如果其它的都不加virtual)并不会成为虚函数或者纯虚函数。在子类中,若重载了继承过来的虚函数,那么新的重载形式(即你的在子类中定义而在父类中没有的同名函数)的函数不会是虚函数。

3、普通函数

       普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数

  普通函数是父类为子类提供的“强制实现”。

  因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

4、抽象类

如果一个类包含有纯虚函数,则该类称为抽象类。

     抽象类一般只能是基类,其声明的纯虚函数由派生类实现。如果派生类没有重写(覆盖)抽象类的纯虚函数则派生类也是抽象类。

     对象不能基于抽象类创建,必须基于派生出来的具体类创建对象,抽象类不能被实例化。

猜你喜欢

转载自blog.csdn.net/hi_baymax/article/details/82424633
今日推荐