📜  C ++中各种继承类型中的运行时多态(1)

📅  最后修改于: 2023-12-03 15:13:45.568000             🧑  作者: Mango

C++中各种继承类型中的运行时多态

在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++继承中最强大的特性之一。虚函数允许在派生类中重定义基类中的函数。纯虚函数强制派生类实现一个函数。覆盖允许派生类中的函数替换基类中的函数实现。无论哪种方式,多态都允许在派生类中使用基类的相同接口,但实现不同。