这周结束了程序设计B的理论学习,我想通过这次的总结的机会系统总结这两章一些细节,最后在谈谈这两章的收获。
一、 继承
-
类继承关系的语法形式
class 派生类名 : 基类名表
{
数据成员和成员函数声明
}; -
派生类的生成过程经历了三个步骤:
●吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
●改造基类成员
通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
●添加派生类新成员
仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。 -
一个例子:
#include<iostream>
using namespace std ;
class A
{
public :
void get_XY() {
cout << "Enter two numbers of x, y : " ; cin >> x >> y ; }
void put_XY() {
cout << "x = "<< x << ", y = " << y << '\n' ; }
protected: int x, y ;
};
class B : public A
{
public :
int get_S() {
return s ; };
void make_S() {
s = x * y ; }; // 使用基类数据成员x,y
protected: int s;
};
class C : public B
{
public :
void get_H() {
cout << "Enter a number of h : " ; cin >> h ; }
int get_V() {
return v ; }
void make_V() {
make_S(); v = get_S() * h ; } // 使用基类成员函数
protected: int h, v;
};
int main()
{
A objA ;
B objB ;
C objC ;
cout << "It is object_A :\n" ;
objA.get_XY() ;
objA.put_XY() ;
cout << "It is object_B :\n" ;
objB.get_XY() ;
objB.make_S() ;
cout << "S = " << objB.get_S() << endl ;
cout << "It is object_C :\n" ;
objC.get_XY() ;
objC.get_H();
objC.make_V() ;
cout << "V = " << objC.get_V() << endl ;
}
- 基类与子类的set、show函数
void set(){
//隐藏了基类中的同名成员
Person::set(); //调用继承于基类的成员函数访问继承于基类的数据成员
cout<<"zhuanye\tt_class\tscore"<<endl;
cin>>zhuanye>>t_class>>score;
}
void show() {
Person::show();
cout<<zhuanye<<" "<<t_class<<" "<<score<<endl;
}
-
●派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员
●在派生类中使用基类的同名成员,显式地使用类名限定符:
类名 :: 成员 -
●基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
● 派生类中访问静态成员,用以下形式显式说明:
类名 :: 成员 或
通过对象访问 对象名 . 成员 -
基类的初始化
构造函数
● 派生类构造函数声明为:
派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 ) … 对象成员n ( 变元表 )
●构造函数执行顺序:基类 -> 对象成员-> 派生类
#include<iostream>
using namespace std ;
class parent_class
{
int data1 , data2 ;
public :
parent_class ( int p1 , int p2 ) {
data1 = p1; data2 = p2; }
int inc1 () {
return ++ data1; }
int inc2 () {
return ++ data2 ; }
void display () {
cout << "data1=" << data1 << " , data2=