公用基类在派生类中的访问属性
公用基类的成员 在公用派生类中的访问属性
私有成员 不可访问
公用成员 公用(派生类成员函数可访问,派生类对象也可访问)
保护成员 保护
// 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){}
在建立一个对象时,执行构造函数的顺序是:①派生类构造函数先调用基类构造函数 ②再执行派生类构造函数本身。
在释放一个对象时,执行析构函数的顺序是:①先执行派生类析构函数 ②再执行基类析构函数。