前言
继续复习c++
虚函数
使用虚函数使得不同派生类使用基类指针调用时能够得到行为一致性的保证。这听起来有点抽象,意思是:
如果将派生类地址赋值给基类指针,再调用派生类中的函数,会失效,还是会调用基类中的同名函数。而基类中使用virtual关键字修饰的函数,在指针调用时则不会有这个问题。
详细请看:C++虚函数简单讲解
未使用虚函数,不能正确调用
class animal
{
public:
void speak(){
cout<<"animal speak!"<<endl;}
};
class cat : public animal
{
public:
void speak(){
cout<<"cat speak!"<<endl;}
};
int main()
{
animal* a = new cat();
a->speak();
return 0;
}
使用虚函数,正确调用实现多态
class animal
{
public:
virtual void speak(){
cout<<"animal speak!"<<endl;}
};
class cat : public animal
{
public:
void speak(){
cout<<"cat speak!"<<endl;}
};
int main()
{
animal* a = new cat();
a->speak();
return 0;
}
虚基类
虚基类又名抽象类,只包含虚函数。虚函数未被实现,需要用 xxx = 0
来修饰
virtual void speak() = 0;
继承一个虚基类需要实现其所有的虚函数,这起到了规范化的作用,因为有些对象必须实现特定的函数,否则无法正确运行。
如果未实现虚基类所有虚函数,那么会报错。
下面的代码演示了继承一个抽象类,并且实现其抽象方法的过程
class animal
{
public:
virtual void speak() = 0;
};
class cat : public animal
{
public:
void speak(){
cout<<"cat speak!"<<endl;}
};
int main()
{
animal* a = new cat();
a->speak();
return 0;
}
虚继承与多继承
不同于其他面向对象语言,c++支持多继承,即一个类可以继承很多基类。