当前位置:  编程技术>c/c++/嵌入式

C++中基类和派生类之间的转换实例教程

    来源: 互联网  发布时间:2014-10-27

    本文导语:  本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公有继承,关键字public。具体分析如下: 以下程序为讲...

本文实例讲解了C++中基类和派生类之间的转换。对于深入理解C++面向对象程序设计有一定的帮助作用。此处需要注意:本文实例讲解内容的前提是派生类继承基类的方式是公有继承,关键字public。具体分析如下:

以下程序为讲解示例:

#include
using namespace std;

class A
{
public:
  A(int m1, int n1):m(m1), n(n1){}
  void display();
private:
  int m;
  int n;
};

void A::display()
{
  cout  number;
if (number >= 0)
  pa = &a;
else
  pa = &b;

pa指向的对象类型依赖于输入,运行时才输入,所以编译器是没有办法知道pa指向哪个类型的。

2.派生类对象赋值给基类引用

引用跟指针基本没有区别,引用本质上是指针,是个指针常量,具体可以参照我的另一篇C++中的引用和指针的联系和区别

main函数中执行以下代码

A a(3, 4);
B b(10, 20, 30);
print1(b);      //会输出 10 20

形参为基类引用,实参为派生类对象,派生类对象也是基类对象,可以赋值给基类引用。输出派生类中基类部分。

注意:此时对象本身并未复制,b仍然是派生类对象,前面说过了引用就是一个指针。

3.派生类对象赋值给基类对象。

A a(3, 4);
B b(10, 20, 30);
print3(b);

派生类对象基类部分被复制给形参。

注意:实际上没有从派生类对象到基类对象的直接转换。对基类对象的赋值或初始化,实际上在调用函数,初始化时调用构造函数,赋值时调用赋值操作符。

二、基类到派生类的转化

切记:这种转换有可能引发严重的安全问题,编写代码时不要使用。没有基类到派生类的自动转换,原因在于基类对象只能是基类对象,不能包含派生类型的成员。

如果允许用基类对象给派生类对象赋值,那么就可以试图使用该派生类对象访问不存在的成员。

A a(3, 4);
B b(10, 20, 30);
A * pa;
B * pb;
//  print2(a);      //错误。不能用基类对象给派生类引用赋值。
//  print4(a);      //错误。不能用基类对象给派生类对象赋值。
//  pb = &a;       //错误。派生类指针不能指向基类对象。

pa = &a;
pb = &b;

//pb = pa;           //错误。不能用基类指针给派生类指针赋值。

pb = (B*)pa;     //可以强制转换,但是非常不安全。
pb->display();    //出现安全问题,p无法访问,因为a中没有p成员

注意到我们使用强制转换时,当派生类添加了基类中不存在的成员时,会出现安全问题。

pb->display();会调用派生类的display函数,但是它指向的内存是基类对象a的内存,p不存在。会出现严重后果。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3