欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > C++多态

C++多态

2025/2/8 6:36:33 来源:https://blog.csdn.net/qq_67693066/article/details/145492866  浏览:    关键词:C++多态

C++多态

  • 多态
    • 虚函数
    • 虚函数重写
    • 虚函数重写的两个例外
      • 协变
      • 析构函数的重写
  • 虚函数表

C++引入类之后,我们还剩下一个多态没讲,多态的实现主要依靠虚函数

多态

多态说白了就是一件事不同的人做有不同的效果

class Animal
{
public:virtual void Cry() {std::cout << "Animal Cry" << std::endl;}
};class Dog : public Animal
{
public:void Cry() override{std::cout << "Dog Cry" << std::endl;}
};class Cat : public Animal
{
public:void Cry() override{std::cout << "Cat Cry" << std::endl;}
};int main()
{Dog d;Cat c;d.Cry();c.Cry();
}

在这里插入图片描述

虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数
在这里插入图片描述

虚函数重写

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

多态的实现主要就是靠虚函数的重写来完成的。多态的形成条件主要有两

  1. 必须通过基类的指针或者引用调用虚函数
  2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

虚函数重写的两个例外

协变

  1. 协变(基类与派生类虚函数返回值类型不同)
    派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变
class A{};
class B : public A {};
class Person {
public:virtual A* f() {return new A;}
};
class Student : public Person {
public:virtual B* f() {return new B;}
};

析构函数的重写

如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor

class Animal
{
public:virtual void Cry() {std::cout << "Animal Cry" << std::endl;}virtual ~Animal(){std::cout << "~Animal()" << std::endl;}
};class Dog : public Animal
{
public:void Cry() override{std::cout << "Dog Cry" << std::endl;}~Dog(){std::cout << "~Dog()" << std::endl;}};class Cat : public Animal
{
public:void Cry() override{std::cout << "Cat Cry" << std::endl;}~Cat(){std::cout << "~Cat()" << std::endl;}
};int main()
{Animal* dog = new Dog;Animal* cat = new Cat;delete dog;delete cat;
}

在这里插入图片描述

虚函数表

打断点,查看具体信息可以看到除了本身的信息之外,还多了一个_vptr:
在这里插入图片描述这个就是虚函数表,里面会存放所有的已经重写了的虚函数,当程序运行
起来以后到对象的中取找的

更详细的可以查看我以前的博客:

https://blog.csdn.net/qq_67693066/article/details/133970558

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com