代码重用: 组合、继承
组合:拿已有的对象拼接出新的对象. (实的)
继承: 拿已有的类进行改造,得到新的类.(虚的)
Person: 父类
Student: 子类
传统做法:老类放在上面,新的类放在下面.
#include <iostream>
using namespace std;
class A
{
public:
A():i(0) { cout << "A::A()" << endl; }
~A() { cout << "A::~A()" << endl; }
void print() { cout << "A::f()" << i << endl; }
void set(int ii) { i = ii; }
private:
int i;
};
//继承 B是A的子类
class B:public A {
};
int main()
{
B b; //B继承了A所有的东西
//类B是A的子类,当申请对象b时将自动调用A的构造函数
//A::A()
b.set(10);
b.print(); //A::f()10
return 0;
//运行完程序return 0后,将调用A的析构函数
//A::A()
}
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
private:
int i;
public:
A():i(0) { cout << "A::A()" << endl; }
~A() { cout << "A::~A()" << endl; }
void print() { cout << "A::f()" << i << endl; }
void set(int ii) { i = ii; }
};
//继承 B是A的子类
class B :public A {
public:
void f() {
set(20);
print();
//i = 90;//此代码会出错,原因是i是A的private成员变量,只能被A类的成员函数使用,不能被B使用.
}
};
int main()
{
B b; //B继承了A所有的东西
//调用A的构造函数
//A::A()
b.set(10);
b.print(); //A::f()10
b.f(); //A::f()20
return 0;
//A::`A()
}
//public:被谁都可以使用
//private:被自己类的成员函数使用
//protected:被自己类和子子孙孙类使用
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
private:
int i;
public:
A():i(0) { cout << "A::A()" << endl; }
~A() { cout << "A::~A()" << endl; }
void print() { cout << "A::f()" << i << endl; }
protected:
void set(int ii) { i = ii; }
};
//继承 B是A的子类
class B :public A {
public:
void f() {
set(20);
print();
//i = 90;//此代码会出错,原因是i是A的private成员变量,只能被A类的成员函数使用,不能被B使用.
}
};
int main()
{
B b; //B继承了A所有的东西
//调用A的构造函数
//b.set(10); //此代码会出错,原因在于set()函数在A类中是protected, 只能被自己类和子子孙孙类调用.故此行出错.
b.print();
b.f();
return 0;
}
//public:被谁都可以使用
//private:被自己类的成员函数使用
//protected:被自己类和子子孙孙类使用
一般写程序的方式:
(1). 让数据都是private
(2). 给所有人用的东西放在public里面
(3). 留一些protected接口给子类, 告诉子类用protected的东西来访问private的数据. 这些手段只留给你.