public 公用继承


          公用基类在派生类中的访问属性
公用基类的成员      在公用派生类中的访问属性
私有成员                 不可访问
公用成员                 公用(派生类成员函数可访问,派生类对象也可访问)
保护成员                 保护

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

    class  Student
    {
    public:

        Student(int nu=1,string na="stu1",char se='f'):num(nu),name(na),sex(se){}

        void display()
        {
        cout<<"num:"<<num<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"sex:"<<sex<<endl;
        }

    private:
        int num;
        string name;
        char sex;

    };


    class  Student1:public Student//公用继承
    {
    public:

        Student1(int ag=20,string ad="shanghai"):age(ag),address(ad){}

        void display_1()
        {
    //    cout<<"num:"<<num<<endl;//错误,无法访问
    //    cout<<"name"<<name<<endl;//错误,无法访问
    //    cout<<"sex"<<sex<<endl;//错误,无法访问
    //    display();//正确,可以访问
        cout<<"age:"<<age<<endl;
        cout<<"address:"<<address<<endl;
        }

    private:
        int age;
        string address;

    };

int main(int argc, char* argv[])
{    
    Student stu(3,"stu3",'m');//或Student stu;
    stu.display();

    Student1 stu1(20,"shenzhen");//或Student stu;
    stu1.display();
    stu1.display_1();

    cout<<"sizeof(stu):"<<sizeof(stu)<<endl;
    cout<<"sizeof(stu1):"<<sizeof(stu1)<<endl;

    return 0;
}
执行结果
num:3
name:stu3
sex:m
num:1
name:stu1
sex:f
age:20
address:shenzhen
sizeof(stu):24
sizeof(stu1):44
Press any key to continue

可以看出:
1.尽管Student1类含有num,name,sex这3个成员变量,但是Student1中没有任何一个机制可以直接访问他们。只能通过调用基类Student的公有成员函数去访问之。也即,
Student1 stu1,则stu1对象就会有num,name,sex这3个成员变量和age,address这2个私有成员变量。但是stu1无法直接访问这5个成员变量:stu1的成员函数可以直接访问后两者,但是无法直接访问前三者。必须用Student的成员函数去访问前三者。
2.创建对象stu1时用Student1 stu1(20,"shenzhen");可以看出只需初始化本类的石油数据成员呢。对基类的私有数据成员在派生类中无法直接访问,所以无法直接初始化。
所以派生类的这种构造函数不好,改成一下形式

    // test.cpp : Defines the entry point for the console application.  
    //  
      
    #include "stdafx.h"  
    #include <iostream>  
    #include <string>  
    using namespace std;  
      
        class  Student  
        {  
        public:  
      
            Student(int nu=1,string na="stu1",char se='f'):num(nu),name(na),sex(se){}  
      
            void display()  
            {  
            cout<<"num:"<<num<<endl;  
            cout<<"name:"<<name<<endl;  
            cout<<"sex:"<<sex<<endl;  
            }  
      
        private:  
            int num;  
            string name;  
            char sex;  
      
        };  
      
      
        class  Student1:public Student//公用继承  
        {  
        public:  
      
            Student1(int nu=1,string na="stu1",char se='f',int ag=20,string ad="shanghai"):Student(nu,na,se)
			{
			age=ag;
			address=ad;
			}
      
            void display_1()  
            {  
        //    cout<<"num:"<<num<<endl;//错误,无法访问  
        //    cout<<"name"<<name<<endl;//错误,无法访问  
        //    cout<<"sex"<<sex<<endl;//错误,无法访问  
        //    display();//正确,可以访问  
            cout<<"age:"<<age<<endl;  
            cout<<"address:"<<address<<endl;  
            }  
      
        private:  
            int age;  
            string address;  
      
        };  
      
    int main(int argc, char* argv[])  
    {      
        Student stu(3,"stu3",'m');//或Student stu;  
        stu.display();  
        cout<<endl;
        Student1 stu1(6,"stu6",'f',20,"shenzhen");//或Student stu;  
        stu1.display();  
        stu1.display_1();  
      
        cout<<"sizeof(stu):"<<sizeof(stu)<<endl;  
        cout<<"sizeof(stu1):"<<sizeof(stu1)<<endl;  
      
        return 0;  
    }  
Student1的构造函数中调用了基类的构造函数
            Student1(int nu=1,string na="stu1",char se='f',int ag=20,string ad="shanghai"):Student(nu,na,se)
            {
            age=ag;
            address=ad;
            }

其中后面Student(nu,na,se)的2个参数就是由前面Student1(int nu=1,string na="stu1",char se='f',int ag=20,string ad="shanghai")的参数分来的。
表示用这样的实参调用Student函数,当然如果必要也可以用Student(66,na,se)而不使用输入的nu

这样在创建派生类对象的时候就可以初始化全部参数了:
Student1 stu1(6,"stu6",'f',20,"shenzhen");

另外Student1 的构造函数也可以用如下形式,即初始化表和基类构造函数--p169
Student1(int nu=1,string na="stu1",char se='f',int ag=20,string ad="shanghai"):Student(nu,na,se),age(ag),address(ad){}

另外,如果在基类的声明中定义了带参数的构造函数,那么就必须显示的定义派生类的构造函数。并在派生类构造函数中写出基类的构造函数和参数表。--p175

在建立一个对象时,执行构造函数的顺序是:①派生类构造函数先调用基类构造函数   ②再执行派生类构造函数本身。
在释放一个对象时,执行析构函数的顺序是:①先执行派生类析构函数   ②再执行基类析构函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值