C++公有继承

#include <iostream>

using namespace std;

class person
{
public:
    person()
    {
        cout<<"person()"<<endl;
    }
    ~person()
    {
        cout<<"~person()"<<endl;
    }
    void eat()
    {
        name = "hhhhhh";
        age = 24;
        cout<<"eat()"<<endl;
    }

protected:
    string name;
private://父类的私有成员虽然被继承,但是无法使用
    int age;
};

class worker:public person//公有继承,继承了person,person是基类,worker是派生类
{
public:
    worker()
    {
        cout<<"worker()"<<endl;
    }
    ~worker()
    {
        cout<<"~worker()"<<endl;
    }
    void work()
    {
        name = "1111";//protected能访问
        //age = 3;//编译错误,因为是父类的私有成员
        cout<<"work()"<<endl;
    }

    int salary;
};

int main()
{
    /*
    worker *p = new worker;//创建的时候先创建基类,再创建派生类
    p->name = "ya";
    p->eat();//继承之后可以访问基类的数据和函数
    p->work();//也可以访问自己的数据和函数
    delete p;//销毁的时候先销毁派生类,再销毁基类
    p = NULL;
    cout<<endl;
    */

    /*
    person zs;
    zs.eat();//private数据自己能访问
    zs.name;
    */

}

### C++ 公有继承实现学生信息类 在 C++ 中,公有继承是一种常见的继承方式,用于表示“is-a”的关系。通过公有继承,派生类可以获得基类中的公有和保护成员,并将其作为自己的成员对外暴露[^1]。 下面是一个基于公有继承的学生信息管理系统的示例代码: #### 示例代码 ```cpp #include <iostream> #include <string> using namespace std; // 定义基类 Person 表示通用的人的信息 class Person { protected: string name; int age; public: // 构造函数初始化人的基本信息 Person(string n = "", int a = 0) : name(n), age(a) {} // 获取姓名的方法 void getName() const { cout << "Name: " << name << endl; } // 设置年龄的方法 void setAge(int new_age) { if (new_age >= 0 && new_age <= 120) { age = new_age; } else { cout << "Invalid age!" << endl; } } // 显示个人信息 virtual void displayInfo() const { cout << "Person Info:" << endl; cout << "Name: " << name << ", Age: " << age << endl; } }; // 定义派生类 Student 继承自 Person class Student : public Person { // 公有继承 private: string studentID; double gpa; public: // 构造函数初始化学生的具体信息 Student(string n = "", int a = 0, string id = "", double gp = 0.0) : Person(n, a), studentID(id), gpa(gp) {} // 设置学号 void setStudentID(const string& id) { studentID = id; } // 设置 GPA 成绩 void setGPA(double grade_point_average) { if (grade_point_average >= 0.0 && grade_point_average <= 4.0) { gpa = grade_point_average; } else { cout << "Invalid GPA value!" << endl; } } // 覆盖基类的显示信息方法 void displayInfo() const override { cout << "Student Info:" << endl; cout << "Name: " << name << ", Age: " << age << endl; cout << "Student ID: " << studentID << ", GPA: " << gpa << endl; } }; int main() { // 创建一个 Student 对象并测试其功能 Student s("Alice Johnson", 20, "S123456789", 3.8); // 输出学生信息 s.displayInfo(); // 修改学生的年龄和 GPA 并重新输出 s.setAge(21); s.setGPA(3.9); s.displayInfo(); return 0; } ``` 上述代码展示了如何利用公有继承来创建 `Student` 类,该类从 `Person` 基类继承而来。`Student` 添加了自己的特定数据成员(如 `studentID` 和 `gpa`),并通过覆盖基类的虚函数 `displayInfo()` 来展示更详细的学员信息。 --- ### 关键点解释 1. **公有继承的特点** 在公有继承中,基类的公有成员和保护成员会成为派生类的相应访问权限成员。这意味着可以在派生类外部直接调用这些成员函数或变量。 2. **虚函数的作用** 使用 `virtual` 函数可以让派生类重基类的行为。当通过基类指针或引用调用虚函数时,实际执行的是派生类版本的功能[^4]。 3. **构造函数与析构函数** 派生类的构造函数不会自动调用基类的默认构造函数;因此需要显式指定基类构造参数。同样地,如果定义了虚拟析构函数,则可以安全销毁动态分配的对象链表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值