本文共322字。
Copyright: 知识共享署名 非商业性使用 相同方式共享 4.0 国际许可协议
|
CC BY-NC-SA 4.0C++ 中并没有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中的接口。