在main函数中,我们创建了一个Derived类对象,并将其地址赋值给Base类指针base。然后,通过base指针调用foo函数,实际上调用的是Derived类中重写的版本。 需要注意的是,只有当父类的指针或引用指向一个子类对象时,才能通过这种方式调用子类中重写的虚函数。如果父类的指针或引用指向一个父类对象,那么调用虚函数时仍然会调...
在`main`函数中,我们创建了一个父类指针`parent`并指向子类对象,然后调用`foo`方法。由于父类指针指向的是子类对象,所以实际调用的是子类的`foo`方法,输出了'Child's foo'。 这种通过父类指针或引用调用子类方法的方式称为多态。多态能够提高代码的灵活性和可扩展性,使得程序更加易于维护和扩展。同时,多态也是...
多态是面向对象中的另一个重要特性,指父类指针可以指向子类对象,从而调用子类重写的成员函数,实现代码的灵活性。 在C语言中,可以通过定义不同的结构体实现类的继承关系,并使用函数指针来实现多态。 下面是一个例子,以封装一个“动物”的父类和两个子类“狗”和“猫”为例: typedefstruct_Animal {constchar*name;...
// 测试多态:传入的参数类型是父类指针 void Animal_Say(Animal *this) { // 如果this实际指向一个子类Dog对象,那么this->vptr这个虚表指针指向子类自己的虚表, // 因此,this->vptr->say将会调用子类虚表中的函数。 this->vptr->say(this); } 在栈空间定义了一个虚函数表animal_vtbl,这个表中的每一项都...
1.dynamic_cast运算符:以安全的方式将父类的指针或引用转换为派生类的指针或引用。 2.typeid运算符:返回指针或引用所指向对象的具体类型。 RTTI中的dynamic_cast运算符可以让父类对象调用子类对象中的普通成员函数。 RTTI中使用dynamic_cast运算符和typeid运算符的相同前提条件:父类中至少有一个虚函数。
父类指针指向子类实例对象,调用普通重写方法时,会调用父类中的方法。而调用被子类重写的虚函数时,会调用子类中的方法。再次说明了,子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关。程序运行状态改变 程序的运行状态、就绪状态以及阻塞状态之间的相互转化...
忽然想到了C++的多态,一句话“将子类类型的指针赋值给父类类型的指针”,多态是通过虚函数实现。对虚函数及其相关内容的原理、详细理解就不细说了。 说下我的简单理解,有一个基类A和子类B、C,有一个函数以基类A的指针为参数,然后在函数里头通过指针调用基类的成员函数。假如这个被调用的基类成员函数不是虚函数,那...
我们这样理解,base关联着父类的数据结构信息,因为可以通过stu->base->age访问到父类的信息。 同时&stu->base又是和stu指针的值时相等的。 由上述的性质可以用指针模拟oop的面向对象特性。 场景如下 当我调用函数只需要访问父类的信息(更加抽象的信息),而不需要访问子类的数据结构的时候,我们只需要将&stu->base...
多态的意义、多态成立的三个条件(有继承、有虚函数重写、父类指针/引用指向子类对象),多态理论基础(...
子类对象可以赋值给父类的对象、父类的指针、父类的引用: class Person { protected: string _name; string _age; }; class Student : public Person { public: string _stuID; // 学号 }; int main(void) { Student s; // 子类对象可以赋值给父类对象/指针/引用 ...