15. 继承
来源:互联网 发布:win10共享网络 编辑:程序博客网 时间:2024/06/05 07:00
代码重用: 组合、继承
组合:拿已有的对象拼接出新的对象. (实的)
继承: 拿已有的类进行改造,得到新的类.(虚的)
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的数据. 这些手段只留给你.