比较虚函数和纯虚函数的一些区别
先上代码:
#include <iostream>
using namespace std;
class A
{
public:
~A() = default;
virtual void virtualFun()
{
cout << "A's virtualfun" << endl;
}
};
class B
{
public:
~B() = default;
virtual void pureVirtualFun() = 0;
};
void B::pureVirtualFun()
{
cout << "purevirtualfun" << endl;
}
class C : public A,public B
{
public:
void virtualFun() override
{
cout << "C's virtualFun" << endl;
}
void pureVirtualFun() override
{
B::pureVirtualFun();
}
};
void fun(A &o)
{
o.virtualFun();
}
int main()
{
A a;
//B b; //抽象基类不可定义对象
C c;
fun(a);
fun(c); //虚函数的动态绑定
c.pureVirtualFun();
return 0;
}
运行结果:
声明
虚函数:在基类中用 virtual 声明的成员函数,可定义
virtual void virtualFun()
{
...
}
纯虚函数:在虚函数末尾添加 “ =0 ”,做接口使用,也可定义!!!但需要在类外定义。
virtual void pureVirtualFun() = 0;
void B::pureVirtualFun()
{
...
}
用途
- 虚函数
用其动态绑定特性,基类的引用(指针)对象在调用虚函数时,直到运行时才根据传入的具体类型来决定调用哪个版本的虚函数
虚函数在派生类中可以不重新声明、定义。当在派生类中没有对基类的虚函数进行覆盖时,派生类对象调用虚函数时就是调用基类版本的虚函数
如果在派生类中已经有重新定义的虚函数版本,此时还想在派生类中调用基类版本的虚函数,可使用作用域运算符来指定使用基类版本( A::virtualFun() ) - 纯虚函数
作固定接口使用。
包含纯虚函数的类属于抽象基类
抽象基类的纯虚函数可以在类外定义!!!
抽象基类不可定义自己的对象!!!
派生类如果要定义自己的对象,就必须实现基类的纯虚函数,如果没实现,则派生类也是抽象基类