c++ 普通函数 虚函数 纯虚函数 代码例子

#include <string>
#include <iostream>
using namespace std;
class Person
{
public:
    Person(const string& name, int age) : m_name(name), m_age(age)
    {
    }

    virtual void ShowInfo()
    {
        cout << "姓名:" << m_name << endl;
        cout << "年龄:" << m_age << endl;
    }
    virtual void setage(int age=0)
    {
        m_age=age;
    }
    virtual void work()=0;

protected:
    string m_name; //姓名
    int m_age; //年龄
};


class Teacher : public Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }
     void setage(int age=1)
    {
        m_age=age;
    }
    void ShowInfo()
    {
        cout << "姓名:" << m_name << endl;
        cout << "年龄:" << m_age << endl;
        cout << "职称:" << m_title << endl;
    }
    virtual void work()
    {
        cout<<"jiaoshu"<<endl;
    }

private:
    string m_title; //职称
};

class Student : public Person
{
public:
    Student(const string& name, int age, int studyId)
        : Person(name, age), m_studyId(studyId)
    {
    }  void setage(int age=2)
    {
        m_age=age;
    }
 virtual void work()
    {
        cout<<"xuexi"<<endl;
    }
    void ShowInfo()
    {
        cout << "姓名:" << m_name << endl;
        cout << "年龄:" << m_age << endl;
        cout << "学号:" << m_studyId << endl;
    }

private:
    int m_studyId;  //学号
};


int main()
{
//    Person* pPerson = new Person("张三", 22);
//    Person* pTeacher = new Teacher("李四", 35, "副教授");
//    Person* pStudent = new Student("王五", 18, 20151653);
   // Person* pPerson = new Person("张三", 22);
    Teacher* pTeacher = new Teacher("李四", 35, "副教授");
    Student* pStudent = new Student("王五", 18, 20151653);


//    pPerson->setage();
//    pTeacher->setage();
//    pStudent->setage();

    //pPerson->ShowInfo();
    cout << endl;
    pTeacher->ShowInfo();
    pTeacher->work();
    cout << endl;
    pStudent->ShowInfo();
    pStudent->work();
    cout << endl;

    //delete pPerson;
    delete pTeacher;
    delete pStudent;
}





概念性问题:

1:定义一个函数为虚函数,不代表函数为不被实现的函数

2:定义一个函数为虚函数是为了允许用基类的指针来调用子类的这个函数

3:定义一个函数为纯虚函数,才代表函数没有被实现

4:定义纯虚函数就是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数


虚函数的虚就虚在所谓的“”“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻就被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定调用的是基类的函数还是哪个派生类的函数,所以被称为虚函数

虚函数只能借用与指针和引用来达到多态

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但是要求所有派生类都要定义自己的实现方法。

声明了纯虚函数的类是一个抽象类,所以,用户不能创建类的实例,只能创建它的派生类的实例

纯虚函数最显著的特征是:他们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且他们在抽象类中旺旺没有定义

纯虚函数的目的在于,使派生类仅仅只是继承函数的接口

抽象类 

抽象类是一种特殊的类,它是为了抽象和设计的目的建立的,它处于继承层次结构的较上成

带有纯虚函数的类称为抽象类

作用:将有关的操作作为接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以在将这些语义传给自己的子类

抽象类只能作为基类来使用,其纯虚函数的实现是由派生类给出,如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,,,则这个派生类仍然是一个抽象类,如果派生类给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类

抽象类似不能定义对象的



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值