C++ - Virtual关键字

C++ 学习笔记

C++ 关键字 — virtual

简介

  • 来说一下 c++virtual 关键字的作用

class 中的 虚函数

demo1

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
#include <iostream>

class Entity{
public:
void name()
{
std::cout << "Entity" << std::endl;
}
};

class Player : public Entity{
private:
std::string p_name;
public:
Player(const std::string& name){
p_name = name;
}

void name()
{
std::cout << p_name << std::endl;
}
};

void PrintName(Entity* e){
e->name();
}

// 程序的主函数
int main( )
{
Entity* e1 = new Entity();
PrintName(e1);

Player* p = new Player("qinhan");
PrintName(p);

return 0;
}
  • Player 继承了 Entity,但是运行结果如下:
    1
    2
    Entity
    Entity

demo2

  • 增加关键字 virtual & override

  • virtual 写在 base class 的需要被重写的函数前面

  • override 写在 sub class 的重写函数后面

    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
    #include <iostream>

    class Entity{
    public:
    virtual void name()
    {
    std::cout << "Entity" << std::endl;
    }
    };

    class Player : public Entity{
    private:
    std::string p_name;
    public:
    Player(const std::string& name){
    p_name = name;
    }

    void name() override
    {
    std::cout << p_name << std::endl;
    }
    };

    void PrintName(Entity* e){
    e->name();
    }

    // 程序的主函数
    int main( )
    {
    Entity* e1 = new Entity();
    PrintName(e1);

    Player* p = new Player("qinhan");
    PrintName(p);

    return 0;
    }
  • 运行结果如下:

    1
    2
    Entity
    qinhan

纯虚函数

  • base class 中定义纯虚函数,但是没有任何实现,强制 sub class 去实现
  • 接口 的定义就是只包含 纯虚函数,让 sub class 去实现所有的接口
  • 接口 类没有实例
  • 这儿的接口和 golang 中的接口很类似了

demo

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
#include <iostream>

class Entity{
public:
virtual void name() = 0; // 后面的 =0 表明它是纯虚函数
};

class Player : public Entity{
private:
std::string p_name;
public:
Player(const std::string& name){
p_name = name;
}

void name() override
{
std::cout << p_name << std::endl;
}
};

void PrintName(Entity* e){
e->name();
}

// 程序的主函数
int main( )
{
Entity* e1 = new Player("");
PrintName(e1);

Player* p = new Player("qinhan");
PrintName(p);

return 0;
}