派生类的指针绑定到基类的对象(编译通过,但结果不可预知)
2015-04-06 14:28
302 查看
多态是面向对象中最重要的特性。在C++中多态的实现是通过带有虚函数的基类的指针或引用绑定到派生类的对象上来体现的。
如果反过来,派生类的指针或引用绑定到积累的对象上有会有什么结果呢?首先这种做法很可能是没有实际意义的,但是编译却能通过(至少在VS2012下能过)。下面通过一个例子来看看运行结果:
派生类指针pd指向的对象本质上还是基类的对象,内存空间中只包含基类的成员变量。两次调用虚函数都是基类的。
pd->a;pd->b;对于这两句,编译器会按照派生类中的a,b变量的偏移地址去访问,但实际上基类对象内存中并没有在此偏移位置上构造a,b,所以打印的结果是随机的。
如果反过来,派生类的指针或引用绑定到积累的对象上有会有什么结果呢?首先这种做法很可能是没有实际意义的,但是编译却能通过(至少在VS2012下能过)。下面通过一个例子来看看运行结果:
class base { public: base(int x) : a(x) {} virtual void fcn() { cout << "base" << endl; } int a; }; class derived : public base { public: derived(int x) : base(x), a(x), b(x) {} virtual void fcn() { cout << "derived" << endl; } int a; int b; }; int main() { base *pb = new base(100); pb->fcn(); derived *pd = (derived *)pb; //派生类的指针绑定到基类的对象上 pd->fcn(); cout << pb->a << endl; cout << pd->a << endl; cout << pd->b << endl; system("pause"); };运行结果:
派生类指针pd指向的对象本质上还是基类的对象,内存空间中只包含基类的成员变量。两次调用虚函数都是基类的。
pd->a;pd->b;对于这两句,编译器会按照派生类中的a,b变量的偏移地址去访问,但实际上基类对象内存中并没有在此偏移位置上构造a,b,所以打印的结果是随机的。
相关文章推荐
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题 http://blog.csdn.net/unituniverse2/article/details/12302139
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 关于基类、派生类、对象、指针和虚函数、多态、 静态绑定、 动态绑定 纯虚函数、抽象类
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 基类指针指向派生类对象
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析
- 基类指针、派生类指针指向基类对象和派生类对象的4种方式
- 若使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual
- 关于C++基类、派生类的引用和指针(动态绑定和静态绑定)
- C++ 基类指针指向派生对象/派生类指针指向基类对象
- C++ 派生类指针强制指向基类对象
- 基类指针指向派生类对象
- 基类指针指向派生类对象
- 基类与派生类,父类指针指向子类对象
- 基类与派生类的虚表是什么时候设定好的?在类定义完编译的时候还是类执行时动态绑定的?
- C++ 基类指针指向派生类对象
- ?第三讲中孙老师提到的this指针到底指向基类对象还是派生类对象?
- 关于基类指针、派生类指针、基类对象派、生类对象问题
- 【C++】基类指针可以指向派生类对象,派生类指针不可以指向基类对象
- 非多态的继承情况下,基类指针可以指向派生类对象么?