C++多态
多态概念
通俗来讲,就是一个事物的多种形态当不同对象完成某种行为时,所表现出来的不同种的状态称之为多态
多态的定义
在面向对象语言中,对于接口的不同实现方式称之为多态。多态性时允许将父类对象设置成为一个或者多个他的子类对象相等的技术一般用指针实现,赋值之后,父类对象可以根据当前赋值给他的子类对象的特性以不同方式进行调用。
例子:买票的行为,当普通人进行买票时(调用买票函数时),需要买全价票,当学生进行买票时(依旧调用买票函数),可以买半价票,当军人进行买票时(仍然调用买票函数),可以优先进行买票。
多态的实现
class Person
{
public:
virtual void BuyTicket() //基类买票函数必须为虚函数
{
cout << "全价票" << endl;
}
};
class Student : public Person
{
public:
virtual void BuyTicket() //子类需要将基类中的虚函数进行重写
{
cout << "半价票" << endl;
}
};
class Soldier : public Person
{
public:
virtual void BuyTicket()
{
cout << "优先买票" << endl;
}
};
void Func(Person& people)//创建基类的指针或者引用
{
people.BuyTicket();
}
int main()
{
Person p;
Student s;
Soldier sd;
Func(p); //调用Person类中的函数
Func(s); //调用Student类中的函数
Func(sd); //调用Solider类中的函数
return 0;
}
运行结果如下👇
我们根据这个示例,可以得到如下
virtual关键字修饰函数:在继承体系中表示该函数为虚函数,可以被子类重写(虚函数重写), 基类中的虚函数必须加上virtual关键字修饰
虚函数重写:派生类中有一个跟基类完全相同的虚函数(函数名,参数,返回值),则称为子类对基类中的虚函数进行了重写,
重写的作用:完成了多态的基本作用,可以使不同类对象访问通过基类指针或者引用访问其相对应的函数。
虚函数的协变:重写的虚函数的返回值可以适当不同,有且仅有当基类返回值为返回的基类指针或引用相对应的派生类也返回派生类的指针或引用
协变
class A
{
public:
virtual A* Func() //返回A*基类指针
{
cout << "A* Func()" << endl;
return new A();
}
};
class B :public A
{
public:
virtual B* Func() //返回B* 派生类指针
{
cout << "B* Func()" << endl;
return new B();
}
};
void Fun(A* a)
{
a->Func();
}
int main()
{
A a;
B b;
Fun(&a);
Fun(&b);
}
虚函数的适用范围
- 构造函数不能够重写
class A
{
public:
virtual A() // ---error
{
cout << "A()" << endl;
}
};
- 尽量将析构函数进行虚函数定义
class A
{
public:
virtual ~A()
{
cout << "~A()" << endl;
}
};
class B :public A
{
public:
virtual ~B()
{
cout << "~B()" << endl;
}
};
int main()
{
A* a = new A();
B* b = new B();
delete a;
delete b;
}
基类中的析构函数如果是虚函数,派生类中析构函数就是重写了基类中的析构函数(名字不同解决方法:在编译器进行处理之后,将继承体系中的析构函数名字改为相同的了)