• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
demps_c
博客园    首页    新随笔    联系   管理    订阅  订阅
多态

c++支持多态的方法

引用和指针

class a{

public:

  virtual void f(){cout << "1" << endl;}

};

class b:public a{

  public:

    void f(){cout << "2" << endl;}

};

a* f1(a a1,a& a2,a *a3){

  a1.f();// 1

  a2.f();// 2

  a3->f();// 2

  (*a3).f();// 2

  

   a* p1 = new a;

  a* p2 = new b;

  b* p3 = dynamic_cast<b*> (p1);

  p3->f();//Segmentation fault

  p3 = dynamic_cast<b*> (p2);

  p3->f();// no problem

  return p3;

}

void f2(){

  b*  p= f1();

  p->f();//2

  (*p).f();//2

}

//cast其实是一种编译器指令,大部分情况下它并不改变一个指针所含的真正地址,它只影响被指出内存的大小和内容的解释方式

 

 

class x{
60 public:
61 x():val1(0){}
62 int val1;
63 };
64 class y:public x{
65 public:
66 y(int i):val2(i){}
67 int val2;
68 };

void f1(){

  x* p1 = new y(1);

  cout <<p1->val2 << endl;//错误,因为指针p1绝对不能指向类x没有的,平p1最大的用处是虚函数,即多态的作用上

 

class a{
4 public:
5 virtual void f(){cout << "f" << endl;}
6 };
7 class b:public a{
8 public:
9 void f(){cout <<"derived f" << endl;}
10 };
11 void f1(a a1,a& a2,a *a3){
12 a1.f();
13 a2.f();
14 a3->f();
15 }
16 int main(){
17 b b1;
18 f1(b1,b1,&b1);
19 return 0;
20 }

 

结果

f
derived f
derived f

posted on 2013-10-16 17:06  demps_c  阅读(159)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3