一,相似概念
1、多态性
指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
a.编译时多态性:通过重载函数实现
b 运行时多态性:通过虚函数实现。
2、虚函数
虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载
3、抽象类
包含纯虚函数的类称为抽象类。由于抽象类包含了纯虚函数,所以不能定义抽象类的对象
二,两者的区别
虚函数:a:基类本身可以实例化对象(创建对象);
b:基类中必须给出虚函数的实现;
c:“实体继承”
纯虚函数:a:基类本身不可以实例化对象; b:基类纯虚函数可给可不给函数实现;
c:“接口继承”
eg:
#include <iostream>
using namespace std;
class A
{
public:
A(){;}
virtual ~A(){;}
void f1(){cout<<"A::f1"<<endl;}
virtual void f2(){cout<<"A::f2"<<endl;}
virtual void f3()=0;
};
class B : public A
{
public:
B(){;}
virtual ~B(){;}
void f1(){cout<<"B::f1"<<endl;}
void f2(){cout<<"B::f2"<<endl;}
virtual void f3(){cout<<"B::f3"<<endl;}
};
int main(int argc, char* argv[])
{
A *m_j=new B();
m_j->f1();
m_j->f2();
m_j->f3();
delete m_j;
return 0;
}
结果是:A::f1
B::f2
B::f3
从输出结果我们可以看出声明为visual和非visual的输出结果是不一样的,成员函数的动态重载(声明为visual的函数 指针指向的为new的类型,非visual函数 与指针申明的类型一致)
如果在main函数里面 A *m_A = new A();会报错A为一个抽象基类,不能实例化一个对象
如果去掉里面的纯虚函数就可以了