面向对象的程序设计-学习笔记-28-虚函数的使用(实例补充)

/*
成员函数的重载,隐藏和覆盖。并与虚函数进行对比
*/
#include<iostream>
using namespace std;
class base
{
public:
virtual void f(float x){cout<<"base::f(float)"<<x<<endl;}
void g(float x){cout<<"base::g(float)"<<x<<endl;}
void h(float x){cout<<"base::h(float)"<<x<<endl;}
virtual void print(int a,int b){cout<<"a="<<a<<",b="<<b<<endl;}
};
class derived:public base
{
public:
virtual void f(float x){cout<<"derived::f(float)"<<x<<endl;}
void g(int x){cout<<"derived::g(int)"<<x<<endl;}//参数类型不同
void h(float x){cout<<"derived::h(float)"<<x<<endl;}//隐藏
virtual void print(int a,double d){cout<<"a="<<a<<",d="<<d<<endl;}
};
void show(base *p)//多态函数,总是调用基类的虚函数A::print(int a,int b).
/*因为派生类中的虚函数B::print(int a,double d)与基类的虚函数不同,前者不能覆盖后者。即不能实现动态联编*/
{p->print(3,5.8);}//
void show_an(base *p)//可以实现动态联编
{
p->f(3.2);
}
void main()
{
derived d;
base *pb=&d;//派生类对象指针,指向基类
derived *pd=&d;
pb->f(3.14);pd->f(3.14);//
pb->g(3.14);pd->g(3.14);
pb->h(3.14);pd->h(3.14);
cout<<"请注意以下的表现形式的结果:"<<endl;
pb=new base;
pd=new derived;
pb->print(4,8);//基类
show(pb);//调用show,访问基类的print。将实参,转换为整型.调用的是A::print()
pd->print(6,6.8);//派生类的
show(pd);//调用的是A::print
cout<<"可以实现动态的联编:"<<endl;
show_an(pb);
show_an(pd);
/*show无法实现动态联编*/
/*show(pd);
pb->print(1,2);
pd->print(3,4.1);
pd->print(5,6);
show(pb);
show(pd);*/
}

你可能感兴趣的:(C++,opp)