访问控制
传递下去可以一共分为四个特性
- 公有
- 保护
- 私有
- 存在但不可见
虽然它们各自的特性不同,能不能使用也另说,但是在建立类对象的时候,系统都会申请相应的内存,也就是说,无论它们能不能用,它们都存在。
公有继承
- 基类的私有数据成员存在但在派生类里不可见
即不可直接使用:
但可以间接利用公有成员函数访问:
私有继承
- 基类的公有和保护变为派生类的私有,可以在派生里边直接用,但不能在主函数里边用,就和派生类原有的私有数据成员同样的特性。基类的私有在派生类里边存在但不可见,但是可以和上面的方法一样用函数间接使用。
保护继承
- 保护数据成员是专门为基类和派生类之间的层次关系准备的,对外界来说,它和私有数据成员没什么区别。
在基类与派生类之间调用保护类数据成员时,保护类数据成员和公有数据成员用法无异;但在主函数里,保护类数据成员不可见,而公有类数据成员可见,二者有异。
重名成员(不难,随便看看就ok)
屏蔽和访问
1.重名数据成员
class base
{
public :
int a , b ;
} ;
class derived : public base
{
public :
int b , c ;
} ;
void f ()
{
derived d ;
d . a = 1 ;
d . base :: b = 2 ;//作用域控制符访问
d . b = 3 ;
d . c = 4 ;
};
2.重名成员函数
#include<iostream.h>
class A
{
public:
int a1, a2 ;
A( int i1=0, int i2=0 ) {
a1 = i1; a2 = i2; }
void print()
{
cout << "a1=" << a1 << '\t' << "a2=" << a2 << endl ; }
};
class B : public A
{
public:
int b1, b2 ;
B( int j1=1, int j2=1 ) {
b1 = j1; b2 = j2; }
void print() //定义同名函数
{
cout << "b1=" << b1 << '\t' << "b2=" << b2 << endl ; }
void printAB()
{
A::print() ; //派生类对象调用基类版本同名成员函数
print() ; //派生类对象调用自身的成员函数
}
};
void main()
{
B b ; b.A::print(); b.printAB(); }
继承过程中的静态成员
记住共享,无论是基类还是派生类只要它们的数据成员的名字相同,它们的数据成员的大小的改变就是同时的,数据是共享的,尽管不是同一个类里面的数据成员
#include<iostream>
using namespace std;
class B
{
public:
static void Add() {
i++; }
//静态成员函数的功能主要是改变静态数据成员的大小
static int i;//静态数据成员
void out() {
cout << "static i=" << i << endl; }
}