面向对象——模块的延续与发展

简介: 面向对象——模块的延续与发展

模块的延续与发展

模块成员的性质和模块的性质

模块累积的角度,一个大模块是由小模块构成的。

构建一个模块有两种方式:小模块架构成为大模块,由另一个模块继承和派生而来

模块可以通过调用模块成员使用模块成员的性质,这就是组合。

代码理解如下:

#include<bits/stdc++.h>
using namespace std;
class point{
    private:
        int x,y;
    public:
        point(int xx,int yy):x(xx),y(yy){}
        void showpoint(){
            cout<<"("<<x<<","<<y<<")"<<endl;
        }
    ~point(){}
};
///小模块组合为大模块
class circle{
    public:
        point p;
        double r;
    public:
        circle(int xx,int yy,double rr);
        double getarea(){return 3.14*r*r;}
        void shouarea(){
            cout<<"S="<<getarea()<<endl;
        }
};
///构造函数
circle::circle(int xx,int yy,double rr):p(xx,yy),r(rr){}
int main(){
    circle c(3,4,5.1);
    c.shouarea();
    (c.p).showpoint();
    return 0;
}

继承意义与派生模块构造

模块除了组合关系,还有继承关系,简要的说就是把父模块的功能性质直接作为自己的功能性质。


如果一个派生模块只继承了一个基类模块,称为单继承;如果一个派生模块继承了多个基类模块作为自己的子成员,这种继承关系成为多继承。


派生类模块的构造是在已有模块的基础上发展起来的,即派生类模块继承了基类模块的接口功能。


派生模块继承了基类模块,也就是说基类模块是派生模块的一部分,在构造派生模块时当然要构造一个基类模块作为他的子成员。


继承关系

通常涉及到以下两点:1.一个基类模块(父模块)是派生模块的一个构造成员


2.基类模块(父模块)的接口成员在子模块里的访问权限问题。


公有继承关系:派生类把继承下来的基类的接口成员也作为自己的对外接口,从外部来看派生类也具有了基类的性质。


语法如下:

class 派生类名 : public 基类名{
    成员说明列表
}

派生类名是指的新构造的模块,基类名是基础模块,派生类是以基类为基础发展形成的;

public表示的是基类的接口被继承到派生模块后将被提升成为派生类的对外接口

成员说明列表指的是派生模块中除了继承模块外新加的成员。

#include<bits/stdc++.h>
using namespace std;
class base{
    private:
        int b_num;
    public:
        ///无参构造函数
        base(){}
        ///有参构造函数
        base(int i):b_num(i){}
        int getbnum(){return b_num;}
        int setnum(int x){b_num=x;}
        void showbnum(){cout<<b_num<<endl;}
        ~base(){}
};
///定义的继承派生关系,没有添加新成员
///公有继承,基类的对外接口继承下来成为派生类的对外接口
class derived:public base{
};
int main(){
    cout<<"测试基类性质"<<endl;
    base b;
    cout<<b.getbnum()<<endl;
    b.setnum(500);
    cout<<b.getbnum()<<endl;
    cout<<"基类base的对象大小为"<<sizeof(b)<<endl;
    cout<<"测试派生类性质"<<endl;
    derived d;
    cout<<d.getbnum()<<endl;
    d.setnum(555);
    cout<<d.getbnum()<<endl;
    cout<<"派生类derived的对象大小为"<<sizeof(d)<<endl;
    return 0;
}

保持原有访问属性,私有还是私有:

#include<bits/stdc++.h>
using namespace std;
class A{
    private: int a;
    public: int puba;
    public:
        void showa(){cout<<a<<endl;}
        int geta(){return a;}
};
class B{
    private: int b;
    public: int pubb;
    public:
        void showb(){cout<<b<<endl;}
        int getb(){return b;}
};
///公有继承下类C有6个接口成员
class C: public A, public B{
};
int main(){
    C e;
    cout<<e.geta()<<endl;
    cout<<e.puba<<endl;
    cout<<e.getb()<<endl;
    cout<<e.getb()<<endl;
    e.showa();
    e.showa();
    return 0;
}
目录
相关文章
|
8月前
|
算法 测试技术 开发者
编程范式之争:面向对象与函数式的较量
在当今软件开发领域,面向对象编程(OOP)和函数式编程(FP)是两种备受瞩目的主流编程范式。本文将比较这两种范式的特点和优势,并探讨如何在实际项目中进行选择。
|
5月前
|
算法 Java 程序员
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
83 9
|
8月前
|
设计模式 监控 算法
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(通用语言体系)
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(通用语言体系)
157 2
|
5月前
|
程序员
软件设计与架构复杂度问题之战略编程与战术编程的主要区别如何解决
软件设计与架构复杂度问题之战略编程与战术编程的主要区别如何解决
|
8月前
|
存储 算法 Java
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(一)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
128 1
|
8月前
|
SQL 机器学习/深度学习 存储
数据库设计革命:逻辑模型的演变与面向对象的突破
数据库设计革命:逻辑模型的演变与面向对象的突破
75 1
|
8月前
|
存储 设计模式 监控
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(二)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
104 0
|
8月前
|
Java API
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(三)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
105 0
产品第三版面向对象角度的DDD落地
我们应该关注谁来做事,而不是怎么做事
|
安全 数据可视化 测试技术
【设计思维框架】框架 :为现代企业重新设想的设计思维(下)
【设计思维框架】框架 :为现代企业重新设想的设计思维