用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

C++继承和虚函数

2014-12-06 作者: 德良举报

[c++]代码库

//C++继承和虚函数(具体见附件)


//-----------继承--inheritance:------------
//程序1:
#include<iostream>
using namespace std;
class Person{
protected:
  string name;//由于是protected类型,故在子类里面可以访问 
private:
  bool gender;
public:
  Person(const char *a,bool g=true):name(a),gender(g){}
  void show()
  {
    cout<<"大家好,我是"<<(gender?"帅哥":"美女")<<name<<endl;
    cout<<",很高兴认识大家!"<<endl;
  }
  void eat(const char *food)
  {
    cout<<"我喜欢吃"<<food<<"."<<endl;
  }
};

class Student:public Person{
  int gread;
  string major;
public:
  //公有继承父类的,可以访问它里面的公有成员以及受保护的成员
  //如果在子类构造函数里面要初始化父类里面的成员,就把相应的参数传给
//父类的构造函数 
  Student(const char *a,bool g,int G,const char *m)
  :gread(G),major(m),Person(a,g){}//注意这里对父类成员的初始化
  void show()//改写来自父类成员,隐藏父类的同名成员
  {
    cout<<"大家好,我是"<<name<<endl;
    cout<<",很高兴认识大家!"<<endl;
  }
  void details()
  {
    cout<<"我现在是大学"<<gread<<"年级学生,"<<name<<"我的专业是"<<major;
    cout<<",希望一起交流!"<<endl;
  }
};
int main()
{
  Person a("铁蛋",true);
  a.show();
  a.eat("火腿肠");
  Student b("胖妞",false,3,"信息"); 
  b.show();
  b.eat("火腿");
  b.details();
}


//----------多重继承、虚继承:------------

  
//虚继承:
//1.来自虚基类的成员合并,只保留一份到最下层子类里面
//2.虚基类构造函数的参数,由底层子类直接传递
//3.虚继承,保证虚基类的成员到最底层子类里面只保留一份
#include<iostream>
using namespace std;
class Goods{
  double price;
public:
  Goods(double p=100):price(p){cout<<"Goods()"<<endl;}
  ~Goods(){cout<<"~Goods()"<<endl;}
  //double Price()
  void Price()
  {
    //return price;
    cout<<price<<endl;
  }
};
class Camera:virtual public Goods{
public:
  Camera(double p):Goods(p){cout<<"Camera()"<<endl;}
  ~Camera(){cout<<"~Camera()"<<endl;}
  void take(const char* obj)
  {
    cout<<"给"<<obj<<"照相."<<endl;
  }
};
class MP3:virtual public Goods{
public:
  MP3(double p):Goods(p){cout<<"MP3()"<<endl;}
  ~MP3(){cout<<"~MP3()"<<endl;}
  void play(const char *song)
  {
    cout<<"播放歌曲<<"<<song<<">>"<<endl;
  }
};
class Phone:virtual public Goods{
public:
  Phone(double p):Goods(p){cout<<"Phone()"<<endl;}
  ~Phone(){cout<<"~Phone()"<<endl;}
  void dial(const char *no)
  {
    cout<<"给"<<no<<"拨打电话!"<<endl;
  }
};
//多重继承,构造函数执行的顺序是按照子类继承父类的顺序执行
//同时,子类的构造函数是最后执行(即一个类总是先调用父类的构造函数)
class ModernPhone:public Phone,public Camera,public MP3
{
  string factory;
public:
  ModernPhone(const char *f,double p):factory(f),Phone(p),Camera(p),MP3(p),Goods(p)
  {
    cout<<"ModernPhone()"<<endl;
    cout<<"手机厂商"<<factory<<endl;
  }
  ~ModernPhone(){cout<<"~ModernPhone"<<endl;}
  void visitnet(const char *url)
  {
    cout<<"访问网址"<<url<<endl;
  }
};
int main()
{
  ModernPhone mp("Apple",300);
  mp.dial("18710831610");
  mp.play("最炫民族风");
  mp.Price();
  return 0;
}

//--------虚函数、多态---(polymorphism[pɒlɪ'mɔːfɪz(ə)m]):------------
//程序1:
//通过指针调用虚函数的时候才会实现多态
#include<iostream>
using namespace std;
class Person{
protected:
  string name;
private:
  bool gender;
public:
  Person(const char *a,bool g=true):name(a),gender(g){}
  virtual void show()//虚函数
  {
    cout<<"大家好,我是"<<(gender?"帅哥":"美女")<<name<<endl;
    cout<<",很高兴认识大家!"<<endl;
  }
  void eat(const char *food)
  {
    cout<<"我喜欢吃"<<food<<"."<<endl;
  }
};

class Student:public Person{
  int gread;
  string major;
public:
  Student(const char *a,bool g,int G,const char *m)
  :gread(G),major(m),Person(a,g){}
  void show()
  {
    cout<<"大家好,我是"<<name<<endl;
    cout<<",很高兴认识大家!"<<endl;
  }
  void details()
  {
    cout<<"我现在是大学"<<gread<<"年级学生,"<<name<<"我的专业是"<<major;
    cout<<",希望一起交流!"<<endl;
  }
};
int main()
{
  Person a("铁蛋",true);
  Student b("胖妞",false,3,"信息"); 
  Person *p,*q;   //注意这里,p,q两个指针都是Person类型
  p=&a;
  q=&b;
  //会根据对象的类型来决定调用那个对象里面的成员函数
  a.show();
  b.show();
}

//程序2:
//构造函数、析构函数中没有多态
#include<iostream>
using namespace std;
class USB{
public:
  virtual void recognise()
  {
    cout<<"正在识别USB..."<<endl;
  }
  virtual void know()
  {
    cout<<"USB已经接入!"<<endl;
  }
  virtual void display()
  {
    cout<<"USB开始工作."<<endl;
  }
};
//后面的子类里面的成员函数可以不写virtual,默认加virtual
class USBCamera:public USB{
  void recognise()
  {
    cout<<"正在识别相机..."<<endl;
  }
  void know()
  {
    cout<<"相机已经接入!"<<endl;
  }
  void display()
  {
    cout<<"相机开始工作."<<endl;
  }
};
class USBMP3:public USB{
  void recognise()
  {
    cout<<"正在识别MP3..."<<endl;
  }
  void know()
  {
    cout<<"MP3已经接入!"<<endl;
  }
  void display()
  {
    cout<<"MP3开始工作."<<endl;
  }
};
class Computer{
public:
  void use(USB *p)//相当于,用父类申明一个指针,然后用改指针指向相应的成员函数
  {
    p->recognise();
    p->know();
    p->display();
  }
};
int main()
{
//由于父类的成员函数已经申明为虚函数(virtual),所以在调用函数时,会根据相应的子类对象而调用子类里面的成员函数
  USBCamera ca;
  USBMP3 m;
  Computer c;
  c.use(&ca);
  c.use(&m);
  return 0;
}


//--------------纯虚函数:-------------
//程序1:
//只有用new创建对象,用delete释放对象,虚析构才起作用
//构造、析构函数没有纯虚函数
//子类一定是父类,所以可以将一个子类赋给父类,但父类不一定能够赋给子类
#include<iostream>
using namespace std;
class Animal{
public:
  Animal(){}
  virtual ~Animal(){}//虚析构
  //~Animal(){shout();}
  void play()
  {
    eat();
    shout();
    sleep();
  }
  //纯虚函数:提供一个接口,子类覆盖它,自己实现函数的不同功能
  //有纯虚函数的类,称为抽象类abstract class
  //补允许创建抽象类的对象
  virtual void eat()=0;
  virtual void shout()=0;
  virtual void sleep()=0;
};
class Horse:public Animal{
public:
  Horse(){cout<<"马"<<endl;}
  ~Horse(){cout<<"死马"<<endl;}
  virtual void eat(){cout<<"马吃草"<<endl;}
  virtual void shout(){cout<<"马叫"<<endl;}
  virtual void sleep(){cout<<"马睡觉"<<endl;}
};
class Tiger:public Animal{
public:
  Tiger(){cout<<"老虎"<<endl;}
  ~Tiger(){cout<<"死老虎"<<endl;}
  virtual void eat(){cout<<"老虎吃肉"<<endl;}
  virtual void shout(){cout<<"老虎叫"<<endl;}
  virtual void sleep(){cout<<"老虎睡觉"<<endl;}
};
int main()
{
  char c;
  Animal *p=NULL;
  cout<<"选择h代表马,t代表老虎:";
  cin>>c;
  if(c=='h')
    p=new Horse;
  else
    p=new Tiger;
  p->play();
  delete p;
  //Animal a;这里编译出现错误,补允许创建抽象类的对象
  return 0;
}


//程序2:
//虚函数表里存有这个类里面所有虚函数的地址
//每个类只有一个虚函数表,每个对象有一个指针指向这个虚函数表
#include<iostream>
using namespace std;
class A{
  double a;
};
class B{
  double b;
  void fun(){}
};
class C{
  double c;
  virtual void fun(){}
};
class D{
  double d;
  virtual void fun1(){}
  virtual void fun2(){}
  virtual void fun3(){}
};
int main()
{
  cout<<sizeof(A)<<endl;//8
  cout<<sizeof(B)<<endl;
  //sizeof(B)=8,函数在代码区,b在数据区,所以sizeof(b)=8
  cout<<sizeof(C)<<endl;
  //sizeof(C)=12,有虚函数的类,每个对象有一个虚指针,
  //指向一个存有所有虚函数的数组,只占4个字节,与虚函数的个数无关
  cout<<sizeof(D)<<endl;//sizeof(D)=12
  return 0;
}


[源代码打包下载]




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...