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