C++中的接口

本文共322字。
Copyright: 知识共享署名 非商业性使用 相同方式共享 4.0 国际许可协议 | CC BY-NC-SA 4.0

C++ 中并没有interface关键字用于定义接口,而是直接在基类中声明虚函数作为接口,其派生类中必须实现此接口(如果派生类未被实例化过,也可以不实现虚函数),否则编译阶段报错。

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

class Animal {
public:
std::string type;
std::string name;

virtual void eat() = 0;

virtual void die() = 0;

[[nodiscard]] std::string getName() const { return name; }
};

class Dog : public Animal {
public:
Dog() = default;

void eat() override {
std::cout << "Dog eat." << std::endl;
};

void die() override {
std::cout << "Dog die." << std::endl;
};
};

class ShibaInu : public Dog {
public:
ShibaInu() = default;

void eat() override {
std::cout << this->getName() << " eat." << std::endl;
};

void die() override {
std::cout << this->getName() << " die." << std::endl;
};
};

void animalEat(Animal *animalPtr) {
animalPtr->eat();
}

int main(int argc, char *argv[]) {
ShibaInu dog{};
dog.name = "小柴";
animalEat(&dog);
}

上面Animal类中有两个虚函数,Dog类继承自Animal,且Dog实现了两个接口。ShibaInu类继承了Dog,且ShibaInu类重写了两个接口。

此时有个函数animalEat接收Animal类为参数,那么他就可以接收Dog类,也可以接收ShibaInu类,只要接收到的类继承自Animal即可,animalEat就可以调用Animal中的接口。