📅  最后修改于: 2023-12-03 15:13:45.568000             🧑  作者: Mango
在C++中,继承是一种在对象之间共享特征和行为的机制。在继承中,派生类可以继承基类的成员,包括成员变量和成员函数。其中一个强大的特性是多态,这意味着同一个方法名称可以在不同的对象中有不同的实现。在C++中,多态有三种类型:虚函数、纯虚函数和覆盖。
在C++中,虚函数是最常用的多态方式。虚函数是一个可以在派生类中重定义的函数。在一个基类中声明一个函数为虚函数,可以将其重定义为与基类中不同的派生类中的函数。派生类中的虚函数具有相同的名称和参数,但可能有不同的实现。
class Shape {
public:
virtual void draw() {
cout<<"Shape::draw()"<<endl;
}
};
class Circle:public Shape {
public:
void draw() {
cout<<"Circle::draw()"<<endl;
}
};
在上面的代码中,我们声明了一个形状类,其中包含一个虚函数draw,在Circle类中重定义这个虚函数。
int main() {
Shape *s;
Circle c1;
s = &c1;
s->draw();
}
在main()函数中,我们将Shape类的指针赋给Circle派生类的对象,这是多态的效果。最终,程序执行将返回Circle类的draw()函数的输出。
纯虚函数是没有实现的虚函数。基类中包含一个没有函数定义的纯虚函数,这将强制派生类给该函数一个定义。否则,派生类将无法实例化。
class Shape {
public:
virtual void draw() = 0;
};
在上面的代码中,我们声明了一个名为draw()的纯虚函数。继承这个类的任何派生类都需要实现一个draw()函数。否则,这个派生类将不能实例化。
在覆盖中,派生类中的函数与基类中的函数具有相同的名称和参数。但是,派生类中的函数将替换基类中的函数实现。进行覆盖需要在函数中使用关键字override。
class Shape {
public:
void draw() {
cout<<"Shape::draw()"<<endl;
}
};
class Circle:public Shape {
public:
void draw() override {
cout<<"Circle::draw()"<<endl;
}
};
在上面的代码中,我们声明了一个形状类和一个派生类Circle,在Circle类中使用了override关键字重设了基类中的draw()函数。
int main() {
Shape *s;
Circle c1;
s = &c1;
s->draw();
}
在Main()函数中,我们将Shape类的指针赋给Circle派生类的对象,这是多态的效果。最终,程序执行将返回Circle类的draw()函数的输出。
多态是C++继承中最强大的特性之一。虚函数允许在派生类中重定义基类中的函数。纯虚函数强制派生类实现一个函数。覆盖允许派生类中的函数替换基类中的函数实现。无论哪种方式,多态都允许在派生类中使用基类的相同接口,但实现不同。