C++_day7_继承

#include <iostream>

using namespace std;

class Human{
public:
    Human(string const& name, int age):m_name(name), m_age(age)
    {
        cout << "Human构造:" << this << endl;
    }
    ~Human(void)
    {
        cout << "Human析构:"<< this << endl;
    }
    void eat(string const& food)
    {
        cout << "I am eating " << food << '.' << endl;
    }
    void sleep(string const& loc)
    {
        cout << "I am sleepping at " << loc << endl;
    }
    void who(void)
    {
        cout << "My name is " << m_name << ", I'm " << m_age << " years old." << endl;
    }
    string m_name;
    int m_age;
};

class Student: public Human{
public:
    Student(string const& name, int age, int no):Human(name, age), m_no(no)
    {
        cout << "Student构造:" << this << ' ' << &m_no << endl;
    }
    ~Student(void)
    {
        cout << "Student析构:"<< this << endl;
    }
    void learn(string const& course)
    {
        cout << "I am a student, My no is " << m_no << ", I am learning " << course << '.' << endl;
    }
    int m_no;
private:
    int m_a;
protected:
    int m_c; //子类可以访问
};

class Teacher: public Human{
public:
    Teacher(string const& name, int age, float salary):Human(name, age), m_salary(salary)
    {
        cout << "Teacher构造:" << this <<' ' << &m_salary << endl;
    }
    ~Teacher(void)
    {
        cout << "Teacher析构:"<< this << endl;
    }
    void teach (string const& course)
    {
        cout << "I am a teacher, My salary is " << m_salary << ", I'm teaching " << course << '.' << endl;
    }
    float m_salary;
};

int main(void)
{
    Student s1("WJ Zhang", 25, 1001);
    cout << s1.m_name << endl;
    cout << s1.m_age << endl;
    cout << s1.m_no << endl;
    s1.who();
    s1.eat("noodle");
    s1.sleep("floor");
    s1.learn("C++");
    
    Teacher t1("SF Zhang", 90, 20000);
    cout << t1.m_name << endl;
    cout << t1.m_age << endl;
    cout << t1.m_salary << endl;
    t1.who();
    t1.eat("chicken");
    t1.sleep("sofa");
    t1.teach("C++");    
    cout << sizeof(Human) << endl;
    cout << sizeof(Student) << endl;
    cout << sizeof(Teacher) << endl;
    cout << sizeof(string) << endl;
    Human* ph = &s1;    //is a ...
    cout << ph->m_name << endl;
    cout << ph->m_age << endl;
    //cout << ph->m_no << endl;    //error: ‘class Human’ has no member named ‘m_no’
    ph->who();
    Student* ps = static_cast<Student*>(ph);
    cout <<ps->m_no << endl;
    /*导致风险
    Human h1("ZR Zhou", 18);
    ps = static_cast<Student*> (&h1);
    cout << ps->m_no << endl;
    ps->learn("123");
    */
    
    /*谨慎慎用对象截切
    Human h1 = s1;
    cout << h1.m_name << endl;
    cout << h1.m_age << endl;
    */
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lican0319/p/10676306.html