21xrx.com
2024-09-20 06:19:33 Friday
登录
文章检索 我的文章 写文章
C++中静态多态性与动态多态性的不同点
2023-07-11 06:58:29 深夜i     --     --
C++ 静态多态性 动态多态性 不同点

C++是一种面向对象的编程语言,具有多态性特性,这意味着同一个名称可以具有不同的行为,这取决于使用它的上下文。C++中的多态性可以分为静态多态性和动态多态性,二者具有不同的行为和用途。

静态多态性是在编译时确定的,也称为编译时多态性或函数重载。这种多态性允许函数名相同但参数列表不同的函数存在。在调用函数时,编译器根据传递给函数的参数的类型和数量来确定应该调用哪个函数。编译器在编译期间将函数调用与函数声明匹配,因此,静态多态性通常具有较高的效率。以下是一个静态多态性的示例代码:


#include<iostream>

using namespace std;

class A{

public:

  void print(int var)

    cout<<"I am printing an integer "<<var<<endl;

  

  void print(double var)

    cout<<"I am printing a double "<<var<<endl;

  

};

int main(){

  A obj;

  obj.print(5); 

  obj.print(5.5); 

  return 0;

}

在上述代码中,class A中有两个print函数,一个接收int类型的参数,另一个接收double类型的参数。在main函数中,我们实例化了对象obj,并分别使用两种不同类型的参数调用print函数。由于参数类型不同,编译器会确定正确的print函数并将其绑定到对象上。

然而,动态多态性是在运行时确定的,也称为运行时多态性或虚函数。这种多态性允许在基类中声明虚拟函数,并允许被重写的函数在派生类中被实现。在调用函数时,编译器只知道对象的类型,但不知道对象是从哪个派生类实例化的,因此在运行时动态地查找方法,从而确定正确的函数。以下是动态多态性的示例代码:


#include<iostream>

using namespace std;

class A{

public:

  virtual void print()

    cout<<"I am A class"<<endl;

  

};

class B:public A{

public:

  void print()

    cout<<"I am B class"<<endl;

  

};

int main(){

  A* obj1=new A();

  A* obj2=new B();

  obj1->print();

  obj2->print();

  return 0;

}

在上述代码中,class A中声明了一个虚拟函数print,class B继承自class A并重写print函数。在main函数中,我们实例化了两个对象obj1和obj2,并将对象的地址赋给指向基类A的指针。然后,我们调用对象的print函数,由于obj2是从class B实例化的,编译器会动态地查找B的print函数以执行。

虽然静态多态性和动态多态性在C++中都起到非常重要的作用,但它们在实现上有所不同,因此可以根据问题的要求选择适当的多态性类型。静态多态性通过函数重载增加了代码的可读性,而动态多态性通过使用虚函数使代码更易于扩展和修改。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复