C++中包含与继承的初学理解
//============================================================================
// Name : contain.cpp
// Author : chenyan
// Version :
// Copyright : Your copyright notice
// Description : contain in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
class A{
public:
A(){x = 0;y = 0;}
A(int i,int j){x = i;y = j;}
int getx(){return x;}
void setx(int i){x = i;}
int gety(){return y;}
void sety(int i){y = i;}
protected: //保护成员也只能通过公有成员函数来访问,子类可直接访问
int y;
private:
int x;
};
//类的包含
class B{
public:
A c; //公有包含类A的对象,不能直接访问类A对象的私有和保护成员,可以调用类A的公有成员函数访问该对象
B(){y = 0;}
B(int i,int j,int l,int m,int k):a(i,j),b(l,m){y = k;}
A geta(){return a;}
A getb(){return b;}
void setA_x(int i){c.setx(i);}//调用类A的成员函数
void setA_y(int i){c.sety(i);}
int gety(){return y;}
private://私有包含类A的对象,但不能直接访问类A对象的私有和保护成员,必须调用类A的公有成员函数来访问
A a;
A b;
int y;
};
//类的继承
class C:private A{//公有,保护,私有继承都可以
public:
int getA_x(){return getx();}//不能直接访问类A对象的私有成员,必须调用基类的接口函数
int getA_y(){return y;}//可以直接使用本类的公有成员函数访问基类的保护成员
void setA_x(int i){setx(i);}//必须调用基类的公有成员函数来访问基类的私有成员变量
void setA_y(int i){y = i;}//可以直接使用本类的接口函数访问基类的保护成员变量
int getm(){return m;}
void setm(int i){m = i;}
private:
int m;
};
int main() {
B b(1,2,3,4,5);
A a;
C c;
a.sety(5);
c.setA_y(10);//直接使用本类的公有成员函数访问基类的保护成员
cout << "c.y=" << c.getA_y() << endl;//可以直接使用该类的公有成员函数访问基类的保护成员
cout << "a.x=" << a.getx() << endl;
cout << "a.y=" << a.gety() << endl;
//私有包含类必须使用本类的公有成员函数调用被包含类的公有成员函数来访问被包含类的私有和保护成员变量
cout << "b.a.x=" << b.geta().getx() << endl;
cout << "b.a.y=" << b.geta().gety() << endl;
cout << "b.b.x=" << b.getb().getx() << endl;
cout << "b.b.y=" << b.getb().gety() << endl;
cout << "b.y=" << b.gety() << endl;
b.c.sety(20);//公有包含类直接调用被包含类A的公有成员函数
cout << "b.c.y=" << b.c.gety() << endl;
return 0;
}