派生类的指针绑定到基类的对象(编译通过,但结果不可预知)
来源:互联网 发布:芒果店长软件下载 编辑:程序博客网 时间:2024/05/16 15:15
多态是面向对象中最重要的特性。在C++中多态的实现是通过带有虚函数的基类的指针或引用绑定到派生类的对象上来体现的。
如果反过来,派生类的指针或引用绑定到积累的对象上有会有什么结果呢?首先这种做法很可能是没有实际意义的,但是编译却能通过(至少在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,所以打印的结果是随机的。
0 0
- 派生类的指针绑定到基类的对象(编译通过,但结果不可预知)
- 引入派生类后的对象指针
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 不可挽回的过去,不可预知的明天
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明
- C++ 指向空指针的对象(关于编译时绑定和运行时绑定)
- strcpy() 函数给程序带来的不可预知的错误
- 代码简化造成的一个不可预知的问题
- 永远有我们不可预知的错误存在!
- 使用代码处理页面中不可预知的错误
- 多项大数相乘后果不可预知性的问题所在!
- 【读书笔记】黑天鹅 如何应对不可预知的未来
- 对于不可预知错误的探索与思考
- 向死而生|支付宝不可预知的未来
- 用基类指针创建的派生类对象,从而无法访问派生类对象的数据和成员
- 用基类指针创建的派生类对象,无法访问派生类对象的数据和成员
- 【C++】通过基类的指针变量访问派生类中由基类继承来的隐藏对象
- android应用安全——通信安全(android https)
- iOS开发-缓存图片到沙盒
- Linux 标准目录结构
- UGUI Make Use Of Grid Layout Group
- 第五周 程序阅读——static(1)
- 派生类的指针绑定到基类的对象(编译通过,但结果不可预知)
- 多线程之生产者-消费者
- oracle登录无响应问题解决方法(oracle4612267补丁安装教程)
- 常用类"三"(BigInteger,BigDecimal,Date)
- 数据集的基本信息(二)
- Visual Studio工程里的自定义宏
- 蓝桥杯-基础练习-数列排序
- viewstatus
- 继承