🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 24. 多态 **多态**按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 下面的实例中,基类 Shape 被派生为两个类,如下所示: ~~~ //1. 定义了一个 Person 基类,跟 Java class 差不多 class Person { public: //公共的属性 Person(); ~Person(); Person(char *name, char *gen, int age); char *name; char *gen; int age; void setName(char *name); char *getName(); void setGen(char *gen); char *getGen(); void setAge(int age); int getAge(); /** * 虚函数 是在基类中使用关键字 virtual 声明的函数。 * 在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 * @return */ //virtual 转移给子类实现 virtual int test() { return 10; }; }; //2. 定义 DevYK 派生类 class DevYK : public Person { public: DevYK(char *name, int age) : Person(name, "nan", age) {}; int length; DevYK(); ~DevYK(); char *getPersonName(); void setLength(int len); int getLength(); DevYK operator+(const DevYK &b); char *getName(); int test() { return -10; }; }; //3. .cpp 文件 #include "ClssSample.h" #include <iostream> using namespace std; Person::Person(char *name, char *gen, int age) { this->name = name; this->age = age; this->gen = gen; } Person::~Person() { cout << "Person 销毁" << endl; } Person::Person() { cout << "执行 Person 空参构造函数" << endl; } void Person::setAge(int age) { this->age = age; } void Person::setName(char *name) { this->name = name; } void Person::setGen(char *gen) { this->gen = gen; } char *Person::getName() { return this->name; } char *Person::getGen() { return this->gen; } int Person::getAge() { return this->age; } DevYK::DevYK() { cout << "执行 DevYK 空参构造函数" << endl; } DevYK::~DevYK() { cout << "DevYK 销毁" << endl; } char *DevYK::getName() { cout << "DevYK getName" << endl; return this->name; } char *DevYK::getPersonName() { return this->name; } void DevYK::setLength(int len) { this->length = len; } int DevYK::getLength() { return this->length; } // 重载 + 运算符,用于把两个 Box 对象相加 class DevYK DevYK::operator+(const class DevYK &b) { DevYK devYk; devYk.length = this->length + b.length; return devYk; } //3. 测试 void test22() { //父类 Person *person; //定义子类 DevYK devYk("DevYK", 27); if (person) { cout << "Person\t" << person->getName() << "\t" << person->getGen() << "\t" << person->getAge() << endl; } cout << "DevYK->\t" << devYk.getName() << "\t" << devYk.getGen() << "\t" << devYk.getAge() << endl; //把 devyk 的内存地址赋值给 person person = &devYk; if (person) { cout << "Person\t" << person->getName() << "\t" << person->getGen() << "\t" << person->getAge() << endl; } cout << "DevYK 内存地址->\t" << &devYk << " Person 内存地址\t" << person << endl; //获取子类数据 int test = person->test(); cout << "test->\t" << test << endl; } 复制代码 ~~~ > **输出:** > > DevYK-> DevYK getName DevYK nan 27 Person DevYK nan 27 DevYK 内存地址-> 0x7ffee1d26628 Person 内存地址 0x7ffee1d26628 test-> -10 DevYK 销毁 Person 销毁 **虚函数:** **虚函数** 是在基类中使用关键字 **virtual** 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为**动态链接**,或**后期绑定**。 **纯虚函数:** 您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。