Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160058
  • 博文数量: 30
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 19:05
文章分类

全部博文(30)

文章存档

2009年(3)

2008年(27)

我的朋友

分类: C/C++

2008-12-05 13:34:32

    注意虚函数只对指针和引用有效。按值传递对象不允许调用虚函数。
 

//按值传递时的数据切片
#include<iostream>
using namespace std;
class Mammal{
public:
    Mammal(){}
    virtual ~Mammal(){};
    virtual void Speak(){cout<<"Mammal speak!"<<endl;}
private:
    int itsAge;
};

class Dog :public Mammal{
public:
    Dog(){};
    virtual ~Dog(){};
    void Speak();
};
void Dog::Speak(){
     cout<<"Dog speak!"<<endl;
}

class Cat:public Mammal{
public:
    Cat(){};
    virtual ~Cat(){};
    void Speak(){cout<<"Cat speak!"<<endl;}
};

void ValueFun(Mammal mam/*值传递*/){
    mam.Speak();
}
void PtrFun(Mammal* mam/*指针*/){
    mam->Speak();
}
void RefFun(Mammal& mam/*引用*/){
    mam.Speak();
}
int main(){
    Mammal* ptr;        
    ptr=new Dog;        
    ptr->Speak();   //Dog speak!
    ValueFun(*ptr); //Mamaml speak! /*值传递*/
    PtrFun(ptr);    //Dog speak! /*指针*/
    RefFun(*ptr);   //Dog speak! /*引用*/
    return 0;
}

    指针和引用都调用了虚函数,同时调用了Dog->Speak()成员函数。
    然而,间接引用指针是按值传递的。函数希望有一个Mammal对象,因此编译器把Dog对象切到只剩下Mammal部分。这时调用Mammal的Speak()方法。
阅读(659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~