注意虚函数只对指针和引用有效。按值传递对象不允许调用虚函数。
//按值传递时的数据切片 #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()方法。
阅读(688) | 评论(0) | 转发(0) |