多态
多态可以理解为源于用一类的其他类具有相同的特性,但具体的属性、行为、表现又不相同。继承同一基类的子类,都可以实现同一函数,但具体调用时又存在差异。在基类中定义虚函数,让其子类来具体实现这个函数用来做什么。
1、虚函数
#include<iostream>
using namespace std;
class D
{
public :
D()
{
cout<<"调用D的构造函数。"<<endl;
}
public:
virtual void display()
{
}
};
class C :public D
{
public :
C()
{
cout<<"调用C的构造函数。"<<endl;
}
public:
void display()
{
cout<<"C"<<endl;
}
};
class B:public D
{
public :
B()
{
cout<<"调用B的构造函数。"<<endl;
}
public:
void display()
{
cout<<"B"<<endl;
}
};
class A :public B,public C
{
public :
A()
{
cout<<"调用A的构造函数。"<<endl;
}
public:
void display()
{
cout<<"A"<<endl;
}
};
int main()
{
A a;
a.display();
return 0;
}`
如果这样调用不会明显产生虚函数的优势,因为如果不是虚函数,在子类中调用和父类重名函数,也是子类优先。
int main()
{
D *d = new A();
d->display();
return 0;
}
用子类实例化父类,在调用时会调用子类已经重写了的虚函数。
虚继承
上面代码发现调用了两次D类的构造函数,因为是正常继承,如果换成虚继承,对虚继承基类构造函数的调用只会进行一次,防止这个虚继承的其他派生类对虚继承构造函数的调用。
在继承方式前加 virtual,其他代码相同。
#include<iostream>
using namespace std;
class D
{
public :
D()
{
cout<<"调用D的构造函数。"<<endl;
}
public:
virtual void display()
{
}
};
class C :virtual public D
{
public :
C()
{
cout<<"调用C的构造函数。"<<endl;
}
public:
void display()
{
cout<<"C"<<endl;
}
};
class B:virtual public D
{
public :
B()
{
cout<<"调用B的构造函数。"<<endl;
}
public:
void display()
{
cout<<"B"<<endl;
}
};
class A :public B,public C
{
public :
A()
{
cout<<"调用A的构造函数。"<<endl;
}
public:
void display()
{
cout<<"A"<<endl;
}
};
int main()
{
D *d = new A();
d->display();
return 0;
}
抽象类
含有纯虚函数的类称为抽象类
纯虚函数
在虚函数后加=0;并且去掉函数体{}。
区别:虚函数的作用是能够让基类的指针访问到继承树中任何类的同名函数,而纯虚函数则真正代表了,这仅仅是定义了一个接口,在定义了这个纯虚函数(接口)的类中,这个纯虚函数一定不可以实现,继承这个抽象类的子类必须要实现这个接口,否则那个子类也是一个抽象类,