多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
2013-04-12 02:28
861 查看
前一个问题是:非多态情况下,用基类指针去访问派生类的函数。
那么又要问了:多态情况下,怎么用基类指针去访问基类的函数呢?当然这里指的是虚函数。
答案是:用取内容运算符*获得派生类对象,然后再强制转换成基类的对象,用它去调用即可。
ps. 同样的,在多态情况下,用基类指针new一个派生类对象,基类和派生类都会初始化一个对象,然后各自维护。
在用指针去调用数据成员、非虚成员函数时,两者完全相同。
唯一区别是,在多态时,基类指针调用虚函数时会转向派生类,而非多态时没有虚函数,因而没有这种特例。
下面是测试程序,随意感受一下~
View Code
输出是
这是做大摩的笔试题引出来的问题,还有好多关于C++语言细节的东西。做了才知道离精通C++还有很长路要走。
师傅!九九八十一难到啥时候是个头啊?
那么又要问了:多态情况下,怎么用基类指针去访问基类的函数呢?当然这里指的是虚函数。
答案是:用取内容运算符*获得派生类对象,然后再强制转换成基类的对象,用它去调用即可。
ps. 同样的,在多态情况下,用基类指针new一个派生类对象,基类和派生类都会初始化一个对象,然后各自维护。
在用指针去调用数据成员、非虚成员函数时,两者完全相同。
唯一区别是,在多态时,基类指针调用虚函数时会转向派生类,而非多态时没有虚函数,因而没有这种特例。
下面是测试程序,随意感受一下~
View Code
#include <iostream> using namespace std; class A { public: virtual void f() { cout<<"A"<<endl; } }; class B : public A { public: void f() { cout<<"B"<<endl; } }; void main() { A* p=new B; p->f(); (*p).f(); static_cast<A>(*p).f(); delete p; }
输出是
这是做大摩的笔试题引出来的问题,还有好多关于C++语言细节的东西。做了才知道离精通C++还有很长路要走。
师傅!九九八十一难到啥时候是个头啊?
相关文章推荐
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 非多态的继承情况下,基类指针可以指向派生类对象么?
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析(解决面试宝典第四版P147问题)
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- 解释为什么基类的析构函数不为虚的话,基类指针指向子类对象,删除对象时,派生类的析构函数就不会被调用
- 指向派生类对象的基类指针与虚函数
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- 指向子类对象的基类指针调用非虚函数都是基类的函数吗
- 当指针并没有指向实际的对象时,能否调用对象的成员函数
- 多重继承、虚基类继承时,没有显式调用基类构造函数,对象是如何初始化的问题
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明
- Chapter9——建立一个对象数组,内放5个学生的数据(学号,成绩),设立一个函数max,用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
- C++基类指针指向的派生类对象内存的释放
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)
- 【C++】基类指针可以指向派生类对象,派生类指针不可以指向基类对象
- 基类指针指向派生类对象
- 多继承(非虚继承)派生类对象内存结构(基类有虚函数)
- C++中当对象指针为空时,虚函数和非虚函数的调用情况
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?