c++的普通函数,虚函数,纯虚函数,抽象类,接口(纯虚基类)

版权声明:主要是自己学习,别人如果有用,我很开心,人、虽然一般只有我自己看得懂。。。。。 https://blog.csdn.net/qq_27292549/article/details/86253681

1普通函数,虚函数的区别:

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。

而对于普通函数,永远调用的是指针或者引用本身所属的类的函数

即普通函数不能实现多态

2  C++中的纯虚函数“只提供申明,没有实现”,是对子类的约束,是“接口继承”,也是一种“运行时多态”。

3  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能实例化对象,只有实现了这个纯虚函数的子类才能实例化对象。在C++中的一种函数申明被称之为:纯虚函数(pure virtual function).它的申明格式如下:
class CShape
{
public:
    virtual void Show()=0;
};
注意=0,在普通的虚函数后面加上"=0"这样就声明了一个pure virtual function.

 

4  虚函数为了重载和多态的需要,在基类中是有定义的(当然定义也可以为空的一个花括号{}),所以子类中可以重写也可以不写基类中的虚函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,等于java的抽象函数。

5  overload和override 

override是指派生类重写基类的虚函数。重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,但是很少编译器支持这个feature)。
overload是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数即可以接受整型数作为参数,也可以接受浮点数作为参数。 

6 基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。纯虚函数被继承后为 需要实现,所以也变成虚函数。

7  当一个类打算被用作其它类的基类时,它的析构函数必须是虚的(但是构造函数不可以为虚函数。)。否则在

    A * a = new B;//B为A的子类
    delete a;时只会调用A的析构函数,B的不会被调用

但是虚构函数不需要纯虚,隋然可以声明为纯虚,但是没有实际意义

8  一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。即就算父类指针指向子类对象,调用父类的构造或者析构函数时,里面涉及到的函数都将调用自身的函数,而不是子类的函数。

对比

C++虚函数    ==  Java普通函数

C++纯虚函数  ==  Java抽象函数

C++抽象类    ==  Java抽象类,有至少一个抽象函数(纯虚函数)

C++虚基类    ==  Java接口全部为抽象函数(纯虚函数)

猜你喜欢

转载自blog.csdn.net/qq_27292549/article/details/86253681