继承
一、类之间的关系
1. has-A (包含关系)
has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。
2.uses-A(使用关系)
uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友元或对象参数传递实现。
3.is-A(继承关系)
3.is-A 机制称为“继承”。关系具有传递性,不具有对称性。
传递性 高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征
不具有对称性 不是所有植物都属于蕨类
继承 是类之间定义的一种重要关系
一个 B 类继承A类,或称从类 A 派生类 B
类 A 称为基类(父类),类 B 称为派生类(子类)
二、基类和派生类
类继承关系的语法形式
class 派生类名 : 基类名表
{
数据成员和成员函数声明
};
基类名表 构成
访问控制 基类名1, 访问控制 基类名2 ,… , 访问控制 基类名n
访问控制 表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承
1.访问控制
派生类对基类成员的使用,与继承访问控制和基类中成员性质有关
- 公有继承 基类的公有成员->派生类的公有成员
基类的保护成员->派生类的保护成员 - 私有继承 基类的公有成员和保护成员->派生类的私有成员
- 保护继承 基类的公有成员和保护成员->派生类的保护成员
- 不论种方式继承基类,派生类都不能直接使用基类的私有成员
2.公有继承
#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 ;
}
3.私有继承
#include<iostream>
using namespace std ;
class A
{ public :
void get_XY() { cout << "Enter two numbers of x and y : " ; cin >> x >> y ; }
void put_XY() { cout << "x = "<< x << ", y = " << y << '\n' ; }
protected: int x, y ;
};
class B : private A
{ public :
int get_S() { return s ; }
void make_S() { get_XY(); s = x * y ; } //访问私有数据成员
private: int s ;
};
int main()
{ B objB ;
cout << "It is object_B :\n" ;
objB.make_S() ;
cout << "S = " << objB.get_S() << endl ;
}
私有数据成员的测试
#include<iostream>
using namespace std ;
class A
{ public: A(){ x=1; }
int out() {return x ; }
void addX() { x++; }
//基类的私有数据成员
//不能在派生类中直接访问
//但派生类对象建立私有数据空间
private: int x ;
} ;
class B : public A
{ public: B(){ y=1; }
int out() {return y ; }
void addY() { y++; }
private: int y ;
} ;
int main()
{ A a ;
cout << "a.x=" << a.out() << endl ;
B b ;
//创建派生类对象
//调用基类->派生类构造函数
//b.x = 1 b.y = 1
b.addX() ; b.addY() ;
cout << "b.x=" << b.A::out() << endl ;
cout << "b.y=" << b.out() << endl ;
}
4.保护继承
#include <iostream>
class Base {
public:
void publicMethod() {
std::cout << "Public method from Base class" << std::endl;
}
protected:
void protectedMethod() {
std::cout << "Protected method from Base class" << std::endl;
}
};
class Derived : protected Base {
public:
void accessBaseMethods() {
publicMethod(); // 可以访问基类的公有成员
protectedMethod(); // 可以访问基类的保护成员
}
};
int main() {
Derived derivedObj;
derivedObj.accessBaseMethods();
return 0;
}
三、