C++虚函数与多态(一)

简介: C++虚函数与多态

虚函数

virtual修饰的成员函数就是虚函数,

1.虚函数对类的内存影响:增加一个指针类型大小(32位和64位)

2.无论有多少个虚函数,只增加一个指针类型

虚函数表:指向虚函数的指针(监视的窗口看)

我们自己也可以通过虚函数指针表去访问函数(一般做这样的说数据操作,不写数据类型)

include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  virtual void print()
  {
    cout << "第一个虚函数" << endl;
  }
  virtual void printDate()
  {
    cout << "第二个虚函数" << endl;
  }
private:
  int age;
  string name;
};
int main()
{
  cout << sizeof(MM) << endl;
  system("pause");
  return 0;
}

抽象类

拥有一个或一个以上的纯虚函数就被叫做抽象类

特点:

1.抽象类不能够创建对象

2.抽象类可以创建对对象指针

纯虚函数

纯虚函数也是一个虚函数,所以也需要virtual来修饰

特点:

1.纯函数没有函数体

所以函数 = 0;

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  virtual void print() = 0; //纯虚函数
private:
  int age;
};
int main()
{
  //MM mm; //抽象类不能够构造对象
  MM* pmm = nullptr;
  return 0;
}

虚析构函数

在析构函数前面加一个virtual

1.当父类指针对子类对象进行初始化的时候,就要用虚析构函数

2.所有析构函数底层解析的话。函数名想相同

include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  void print()
  {
    cout << "MM" << endl;
  }
  ~MM()
  {
    cout << "MM析构" << endl;
  }
protected:
  string M_name;
};
class son : public MM
{
public:
  void print()
  {
    cout << "son" << endl;
  }
  ~son()
  {
    cout << "son析构" << endl;
  }
};
int main()
{
  MM* p = new son; //父类指针,构造子类对象,先构造父类对象,在构造子类的对象
  delete p;
  system("pause");
  return 0;
}

只调用了父类的析构函数,没有调用子类的析构函数,存在内存的泄露。

所以用父类指针初始化子类的对象,必须使用虚虚构函数

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  void print()
  {
    cout << "MM" << endl;
  }
  virtual ~MM()
  {
    cout << "MM析构" << endl;
  }
protected:
  string M_name;
};
class son : public MM
{
public:
  void print()
  {
    cout << "son" << endl;
  }
  ~son()
  {
    cout << "son析构" << endl;
  }
};
int main()
{
  MM* p = new son; //父类指针,构造子类对象,先构造父类对象,在构造子类的对象
  delete p;
  system("pause");
  return 0;
}



相关文章
|
30天前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
34 2
C++入门12——详解多态1
|
30天前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
73 1
|
3月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
3月前
|
存储 编译器 C++
|
4月前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
53 1
【C++】深度解剖多态(下)
|
3月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
71 0
|
4月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
4月前
|
Java 编译器 C++
【C++】深度解剖多态(上)
【C++】深度解剖多态(上)
52 2
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
|
4月前
|
编译器 程序员 C++
【C++高阶】掌握C++多态:探索代码的动态之美
【C++高阶】掌握C++多态:探索代码的动态之美
43 0