C++多态和虚函数
发表于:2024-12-14 | 分类: C++
字数统计: 656 | 阅读时长: 3分钟 | 阅读量:

C++多态

概念

  • 允许不同数据类型的对象以统一的接口进行交互。
  • 多态是通过函数或运算符的重载(编译时多态)和继承与虚函数(运行时多态)实现
  • 提高了程序的扩展性和灵活性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;

// 基类People
class People
{
public:
People(char *name, int age);
void display();

protected:
char *m_name;
int m_age;
};
People::People(char *name, int age) : m_name(name), m_age(age) {}
void People::display()
{
cout << m_name << "今年" << m_age << "岁了,是个无业游民。" << endl;
}

// 派生类Teacher
class Teacher : public People
{
public:
Teacher(char *name, int age, int salary);
void display();

private:
int m_salary;
};
Teacher::Teacher(char *name, int age, int salary) : People(name, age), m_salary(salary) {}
void Teacher::display()
{
cout << m_name << "今年" << m_age << "岁了,是一名教师,每月有" << m_salary << "元的收入。" << endl;
}

int main()
{
Teacher *t = new Teacher("李四", 35, 8000);
t->m_salary = 10000;
t->display();

People *p = new Teacher("张三", 30, 5000);
p->display();

return 0;
}
  • 上方这样书写,p没有实现多态,本质还是People对象,访问的还是People的成员方法和属性。并且不会执行子类Student的析构
  • 通过多态可以实现基类对派生类的成员函数的访问(编译看左边,运行看右边【子类】)
  • 可以使用虚函数virtual关键字)实现运行时多态

运行时多态

  • 继承关系
  • 子类有重写父类方法(这些方法在基类声明为虚方法virtual,定义时virtual可以不要)
  • 存在基类的指针(new或者&)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
using namespace std;

// 基类People
class People
{
public:
People(string name, int age);
virtual void display();
virtual ~People()
{
cout << "People析构函数" << endl;
}

protected:
string m_name;
int m_age;
};
People::People(string name, int age) : m_name(name), m_age(age) {}
void People::display()
{
cout << m_name << "今年" << m_age << "岁了,是个无业游民。" << endl;
}

// 派生类Teacher
class Teacher : public People
{
public:
Teacher(string name, int age, int salary);
void display();
~Teacher()
{
cout << "Teacher析构函数" << endl;
}

private:
int m_salary;
};
Teacher::Teacher(string name, int age, int salary) : People(name, age), m_salary(salary) {}
void Teacher::display()
{
cout << m_name << "今年" << m_age << "岁了,是一名教师,每月有" << m_salary << "元的收入。" << endl;
}

int main()
{
People *p = new Teacher("张三", 30, 5000); // 先调用父类构造,然后子类构造
p->display(); //调用的是基类构造
delete p; // 先调用子类,然后父类
return 0;
}
上一篇:
ubuntu 没有IP地址
下一篇:
C++虚继承