由于speak()函数是虚函数,因此在运行时会根据指针所指向的对象类型来确定具体调用哪个函数,也就是说,如果指针指向的是Cat对象,那么就会调用Cat中的speak()函数,如果指针指向的是Dog对象,那么就会调用Dog中的speak()函数。 这种通过父类指针调用子类函数的方式,可以帮助我们简化程序设计,提高程序的可维护性和可扩展性...
再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏. 总结: 当定义一个指向子类实例的父类指针的时候,内存中实例化了子类,由于子类继承了父类,因此内存中的子类里包含父类的所有成员...
2. 有没有什么奇技淫巧绕过编译器的检测,通过父类指针来调用fun_t()呢?直接转化为子类对象即可:S...
再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏. 总结: 当定义一个指向子类实例的父类指针的时候,内存中实例化了子类,由于子类继承了父类,因此内存中的子类里包含父类的所有成员...
首先对于main中的变量m_Father, 他的静态类型和动态类型都是Father指针, 之后使用dynamic_cast<Son*>进行强制转换, 按照我的设想, 只有当m_Father的动态类型, 也就是实际指向一个Son的时候, 转换才能够成功, 然而这里不但成功转换, 同时还调用了Son独有的函数fun2, 这不是太奇怪了吗?
类A继承类B,父类B的指针如何调用子类A中的变量和函数? 解决方案: 在父类B类中定义虚函数 父类中有自己的实现,子类重新实现 virtual void Show() { cout << "A::Show()" << endl; } 1. 2. 3. 4. 2. 父类没有实现,子类自己实现 virtual void test(int num) = 0; ...
但是如果去掉 virtual(这里是A*指针指向B对象),改一下立刻有效果,变成了错误(错误情况)。 执行结果: A B ~A 总结:自己类型的指针指向自己的对象,怎么样都没有问题(不管父类析构函数写不写virtual)。只有基类指针指向子类对象的时候,一定需要virtual关键字的配合,才能正确的工作...
父类有虚函数而子类没有,或反之,不能表现出多态行为。当用父类指针调用一个函数时,不管该函数是不...
父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态 其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法 不过,一般多态不是楼主这么用的...