C++程序设计 —— 实验二:继承和多态
一、继承的知识总结
1.1 继承的概念
面向对象程序设计中最重要的一个概念是继承。继承(inheritance)是面向对象程序设计使代码可以复用的重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加功能。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。如下图表示了基类Person和派生类Student的关系:
代码如下:
// 基类
class Person{
public:Person(); // 缺省构造函数string m_strName; // 姓名string m_strSex; // 性别void setSex(string strSex){ // set方法,修改性别m_strSex = strSex;}void getName(){ // get方法,获取姓名return m_strName;}
};// 派生类
class Student:public Person{
public:Student(); // 构造函数string m_strStuID; // 学生学号string getStuID(){ // get方法,获取学生学号return m_strStuID;}
};
1.2 基类和派生类
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
class 派生类类名: 访问修饰符 基类类名
访问修饰符是 public、protected 或 private 其中的一个,如果未使用访问修饰符,则默认访问修饰符为 private。
基类 Person,Student是它的派生类,如下所示:
class Person{
public:string m_strName; //姓名
protected:string m_strSex; //性别
private:int m_nAge; //年龄
};class Student:public Person{
public:int m_nNo; //学号
};
1.3 访问控制和继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
我们可以根据访问权限总结出不同的访问类型,如下所示:
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
一个派生类继承了所有的基类方法,但下列情况除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
1.4 继承类型
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
1.5 继承的优点
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
二、继承访问权限测试
2.1 设计基类
设计Person类具有public, protected, private等不同属性的成员函数或变量:
// 基类
class Person{
public:Person(){}; //无参构造函数Person(string name){ //有参构造函数m_strName = name;}~Person(){}; //析构函数string m_strName; //姓名void setSex(string strSex){ //set方法,设置性别m_strSex = strSex;}void setName(string name){ //set方法,设置姓名m_strName = name;}
protected:string m_strSex; //性别
private:int m_nAge; //年龄
};
2.2 继承基类
Student类通过public, protected,private等不同方式继承Person类,在Student类的成员函数中测试访问Person类的成员函数或变量:
// 派生类 通过public继承
class public_Student:public Person{
public:int m_nNo; //学号void Test(){m_strName = "李小红"; //可访问基类Person的公共型变量m_strSex = "女"; //可访问基类Person的保护型变量m_nAge = 20; //不可访问基类Person的私有型变量}void setSex(string strSex = ""){ //set方法,设置性别 m_strName = ""; //Person基类的m_strSex是protected型的,在派生类Student中有权访问,但外部不能访问m_strSex = strSex; //因此set方法,是提供修改性别的函数}string getSex(){ //get方法,获取性别return m_strSex; //同理,派生类可访问父类的protected型的变量,即可以返回m_strSex}
};
// 派生类 通过protected继承
class protected_Student:protected Person{
public:int m_nNo; //学号void Test(){m_strName = "李小红"; //派生类Student通过protected继承基类Person,公共型变量被降为保护型,在派生类中依然可以访问m_strSex = "女"; //可访问基类Person的保护型变量m_nAge = 20; //不可访问基类Person的私有型变量}void setSex(string strSex = ""){ //set方法,设置性别m_strName = ""; m_strSex = strSex; }string getSex(){ //get方法,获取性别return m_strSex; }
};
// 派生类 通过private继承
class private_Student:private Person{
public:int m_nNo; //学号void Test(){m_strName = "李小红"; //派生类Student通过private继承基类Person,公共型变量被降为私有型,在派生类中不可以访问m_strSex = "女"; //不可访问m_nAge = 20; //不可访问基类Person的私有型变量}void setSex(string strSex = ""){ m_strName = ""; //private继承,不可访问m_strName m_strSex = strSex; //private继承,不可访问m_strSex}string getSex(){ return m_strSex; //private继承,不可访问m_strSex }
};
2.3 外部测试
在Student类中添加public,protected,private等不同属性的成员函数或变量,在外部测试访问Student类的各个成员函数或变量:
// 派生类
class Student:public Person{
public:int m_nNo; //学号void setSex(string strSex = ""){ //set方法,设置性别 m_strName = ""; //Person基类的m_strSex是protected型的,在派生类Student中有权访问,但外部不能访问m_strSex = strSex; //因此set方法,是提供修改性别的函数}string getSex(){ //get方法,获取性别return m_strSex; //同理,派生类可访问父类的protected型的变量,即可以返回m_strSex}double showScore(){ //set方法,录入成绩return m_dScore;}
protected:string m_strCourse; //课程
private:double m_dScore; //成绩
};
// 测试
#include <iostream>
#include "person.h"
using namespace std;
int main()
{Student stu;stu.setSex("女生");stu.setName("李小红");cout<<stu.m_strName<<" "<<stu.getSex();//cout<<stu.m_nAge; //私有型变量不能访问//cout<<stu.m_strSex; //保护型变量不能访问
}
运行结果:
2.4 调整权限
Student类以private方式继承Person类,尝试把Person类中的部分public成员提升为public:
// 派生类
class Student:private Person{
public:int m_nNo; //学号using Person::m_strName; //通过using调整权限,派生类被降为private的变量可以提升为publicvoid setSex(string strSex = ""){ //set方法,设置性别m_strSex = strSex;}string getSex(){ //get方法,获取性别return m_strSex;}void Test(){m_strSex = "男"; //可访问m_strName = "李小明"; //可访问}
protected:using Person::m_strSex; //通过using调整权限,派生类被降为private的变量可以提升为protected
};
三、友元类与继承测试
友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。
3.1 友元类声明
设计类ABase含有私有变量m_a,在类ABase中友元给类CFrnd:
// 基类ABase
class ABase {
private:int m_a; //私有变量m_a
public: ABase(int x=0){ m_a = x; } friend class CFrnd; //声明友元类
};
3.2 友元关系与继承
①设计类BDrived继承ABase,添加私有变量m_b,在类CFrnd中测试访问类BDrived的成员变量m_a,m_b:
// 派生类BDrived 通过public继承ABase
class BDrived:public ABase {
private:int m_b; //私有变量m_b
public: BDrived(int x):ABase(x){m_b = x;}
};
基类的友元类不可访问基类的派生类的私有成员——“朋友不可以访问我儿子的私有物”:
// 类CFrnd
class CFrnd {
public: void Test1(ABase& a) { cout <<a.m_a <<endl; //类CFrnd是类ABase的友元类,所以可以访问} void Test2(BDrived& b) {cout << b.m_a<<endl; //cout <<b.m_b<<endl; //m_c是BDrived的私有成员,类CFrnd不可访问,编译错误}
};
②设计类DFrnd继承CFrnd,在DFrnd的成员函数中测试访问类ABase的成员变量m_a,类BDrived的成员变量m_a,m_b:
基类的友元类的派生类不能访问基类——“朋友的儿子不是我的朋友”:
基类的友元类的派生类不能访问基类的派生类——“朋友的儿子不是我儿子的朋友”:
class DFrnd:public CFrnd {
public: void Test1(ABase& a) { //cout <<a.m_a <<endl; //编译错误,类CFrnd是类ABase的友元类,但不是类CFrnd的派生类DFrnd的友元类,所以不可以访问} void Test2(BDrived& b) {//cout <<b.m_a<<endl; //编译错误,类ABase的派生类BDrived不是友元类CFrnd的派生类DFrnd的友元类,所以不可以访问//cout <<b.m_b<<endl; //编译错误,m_c是BDrived的私有成员,类DFrnd不可访问}
};
3.3 友元的总结
- 类 B 是类 A 的友元类,则A可访问B中所有成员函数和变量。
- 友元类不能继承,类 B 是类 A 的友元类,类A的派生类不是类B的友元类——朋友的儿子不是我的朋友。
- 友元的关系是单向的而不是双向的。如果声明了类 B 是类 A 的友元类,不等于类 A 是类 B 的友元类,类 A 中的成员函数不能访问类 B 中的 private 成员。
- 友元的关系不能传递。如果类 B 是类 A 的友元类,类 C 是类 B 的友元类,不等于类 C 是类 A 的友元类——朋友的朋友不会是朋友。
四、多态的知识总结
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
多态的实现条件:
- 必须是公有继承;
- 必须是通过基类的指针或引用,指向派生类对象访问派生类方法;
- 基类的方法必须是虚函数,且完成了虚函数的重写。
4.1 一般多态性函数
虚函数对于多态具有决定性的作用,有虚函数才能构成多态。
- 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。
- 为了方便,可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽(覆盖)关系的同名函数都将自动成为虚函数。
- 当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。
- 只有派生类的虚函数遮蔽基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为
virtual void func();
派生类虚函数的原型为virtual void func(int);
当基类指针 p 指向派生类对象时,语句p -> func(100),
将会出错;而语句p -> func(),
将调用基类的函数。- 构造函数不能是虚函数。对于基类的构造函数,它仅仅是在派生类构造函数中被调用,这种机制不同于继承。也就是说,派生类不继承基类的构造函数,将构造函数声明为虚函数没有什么意义。
- 析构函数可以声明为虚函数,而且有时候必须要声明为虚函数。
#include <iostream>
using namespace std;// 基类Shape ———— 形状
class Shape {protected:int width, height; //长宽public:Shape(int a=0, int b=0){width = a;height = b;}virtual int area(){ //虚函数,virtual 关键字return 0;}
};// 派生类Rectangle ———— 矩形
class Rectangle: public Shape{public:Rectangle(int a=0, int b=0):Shape(a, b){ }int area(){ //虚函数的重写return (width * height); //矩形面积}
};// 派生类Triangle ———— 三角形
class Triangle: public Shape{public:Triangle(int a=0, int b=0):Shape(a, b){ }int area(){ //虚函数的重写return (width * height / 2); //三角形面积}
};
int main(){Shape shape(0,0);Rectangle rectangle(10,7);Triangle triangle(10,10);cout<<"矩形面积为:"<<rectangle.area()<<endl; //调用矩形的求面积函数cout<<"三角形形面积为:"<<triangle.area()<<endl; //调用三角形的求面积函数return 0;
}
Virtual是C++ 面向对象机制中很重要的一个关键字。基类中加了Virtual关键字的函数就是虚拟函数(例如函数area),于是在基类的派生类中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类指针指向派生类的对象时,对指针的area函数的调用实际上是调用了派生类的print函数而不是基类的print函数。这是面向对象中的多态性的体现。
4.2 纯虚函数
纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0
,表明此函数为纯虚函数。
包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。
抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。
4.3 特殊多态性函数
输入输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用:
// 基类Shape ———— 形状
class Shape {protected:int width, height;public:Shape(int a=0, int b=0){width = a;height = b;}virtual int area(){ //虚函数return 0;}void showArea(Shape* shape){ //通过指针来访问虚函数cout<<"面积为:"<<shape->area()<<endl;}void showArea(Shape& shape){ //通过引用来访问虚函数cout<<"面积为:"<<shape.area()<<endl;}
};// 派生类Rectangle ———— 矩形
class Rectangle: public Shape{public:Rectangle(int a=0, int b=0):Shape(a, b){}//派生类要使用基类的构造函数,须要在构造函数中显式声明int area(){ //虚函数的重写return (width * height); //矩形面积}};// 派生类Triangle ———— 三角形
class Triangle: public Shape{public:Triangle(int a=0, int b=0):Shape(a, b){ }int area(){ //虚函数的重写return (width * height / 2); //三角形面积}
};
int main(){Rectangle rectangle(10,7); //定义rectangle类Triangle triangle(10,10); //定义triangle类rectangle.showArea(&rectangle); //调用方法,测试特殊多态函数triangle.showArea(triangle); return 0;
}
4.3 多继承
什么情况需要虚继承:虚继承是解决 C++ 多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:第一,浪费存储空间;第二,存在二义性问题。针对这种情况,C++ 提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。
// 基类CAnimal
class CAnimal{
public:CAnimal(){}CAnimal(int nLeg){m_nLegs = nLeg;}virtual void Move(){cout<<"Animal move."<<endl;}
protected:int m_nLegs;
};// 派生类CCat
class CCat:virtual public CAnimal
{
public:CCat(){}CCat(int nLegs):CAnimal(nLegs){}void Move(){cout<<"Cat move."<<endl;}
};// 派生类CEagle
class CEagle:virtual public CAnimal
{
public:CEagle(){}CEagle(int nLegs):CAnimal(nLegs){}void Move(){cout<<"Eagle move."<<endl;}
};// 派生类COwl,多继承
class COwl : public CCat, public CEagle
{
public:COwl(int nLegs):CCat(){}void Move(){cout<<"COwl move."<<endl;}
};
补充:关于继承和构造函数
若一个类提供构造函数,则该类就不提供默认的构造函数。 派生类会默认调用基类的无参构造函数。 若基类只有有参的构造函数,而派生类只有无参的构造函数(且不存在默认的参数)会报错。
4.4 析构函数的多态性
用基类指针指向子类的对象,当delete只调用父类的析构函数,不会执行子类的析构函数
解决办法: 把父类中的析构函数写成虚函数,即增加关键字virtual,建虚表
// 基类CAnimal
class CAnimal{
public:CAnimal(){}CAnimal(int nLeg){m_nLegs = nLeg;}virtual ~CAnimal(){cout<<"Animal: ~CAnimal()"<<endl;}virtual void Move(){cout<<"Animal move."<<endl;}
protected:int m_nLegs;
};// 派生类CCat
class CCat:virtual public CAnimal
{
public:CCat(){}CCat(int nLegs):CAnimal(nLegs){}~CCat(){cout<<"Cat: ~CCat()"<<endl;}void Move(){cout<<"Cat move."<<endl;}
};// 派生类CEagle
class CEagle:virtual public CAnimal
{
public:CEagle(){}CEagle(int nLegs):CAnimal(nLegs){}~CEagle(){cout<<"CEagle: ~CEagle()"<<endl;}void Move(){cout<<"Eagle move."<<endl;}
};// 派生类COwl,多继承
class COwl : public CCat, public CEagle
{
public:COwl(int nLegs):CCat(){}~COwl(){cout<<"COwl: ~COwl()"<<endl;}void Move(){cout<<"COwl move."<<endl;}
};
测试:
int main(){COwl owl(2);return 0;
}
可以看出析构函数和构造函数的顺序是向反的,析构函数的调用是从子类到父类。
五、多态性综合运用
设计矢量图,运用多继承设计组合图形,要求具备创建不同类型矢量图、选择图形、移动图形、用不同颜色显示图形(表示选中与否),用vector或数组管理图形。
// ShapeDll ———— shapedll.h#ifndef SHAPEDLL_H
#define SHAPEDLL_H#include "ShapeDll_global.h"
#include <iostream>
#include <QPainter>
#include <math.h>
#include <vector>
using namespace std;class SHAPEDLL_EXPORT ShapeDll{
public:ShapeDll();
};class CPoint; //点
class CRectangle; //矩形
class Triangle; //三角形// 基类CShape ———— 形状
class SHAPEDLL_EXPORT CShape{
public:CShape(); //无参构造函数CShape(const CShape& shape); //拷贝构造函数virtual ~CShape(); //析构函数virtual double GetArea() const; //获取面积virtual bool ptIn(const CPoint& pt) const; //判断点是否在内virtual bool inRect(const CRectangle& rc) const; //判断是否在矩形内virtual void Draw(QPainter& painter) const; //绘制图形virtual CShape* Clone() const; //复制图形virtual CShape& Move(int nOffsetX, int nOffsetY); //移动图形
protected:string m_strName; //名称
};// 派生类CPoint ———— 点
class SHAPEDLL_EXPORT CPoint:public CShape{
public:int m_nPosX; //x坐标int m_nPosY; //y坐标CPoint(){} //无参构造函数CPoint(int nPosX, int nPosY); //有参构造函数CPoint(const CPoint& pt); //拷贝构造函数virtual ~CPoint(); //析构函数double GetArea() const; //获取面积bool ptIn(const CPoint& pt) const; //判断是否在点内bool inRect(const CRectangle& rc) const; //判断是否在矩形内CPoint* Clone() const; //复制图形CPoint& Move(int nOffsetX, int nOffsetY);//移动图形void Draw(QPainter& painter) const; //绘制图形
};// 派生类CRectangle ———— 矩形
class SHAPEDLL_EXPORT CRectangle:public CShape{
public:CPoint m_ptLT; //左上坐标CPoint m_ptBR; //右下坐标CRectangle(const CPoint& pt1, const CPoint& pt2); //有参构造函数CRectangle(const CRectangle& rc); //拷贝构造函数virtual ~CRectangle(); //析构函数double GetArea() const; //获取面积bool ptIn(const CPoint& pt) const; //判断点是否在内bool inRect(const CRectangle& rc) const; //判断是否在矩形内void Draw(QPainter& painter) const; //绘制图形CRectangle* Clone() const; //复制图形CRectangle& Move(int nOffsetX, int nOffsetY); //移动图形
};// 派生类Triangle ———— 三角形
class SHAPEDLL_EXPORT Triangle:public CShape{
public:CPoint m_pt[3]; //三角形的三个顶点坐标Triangle(const CPoint& pt1, const CPoint& pt2, const CPoint& pt3);//有参构造函数Triangle(const Triangle& rc); //拷贝构造函数virtual ~Triangle(); //析构函数double GetArea() const; //获取面积bool ptIn(const CPoint& pt) const; //判断点是否在内bool inRect(const CRectangle& rc) const; //判断是否在矩形内void Draw(QPainter& painter) const; //绘制图形Triangle* Clone() const; //复制图形Triangle& Move(int nOffsetX, int nOffsetY); //移动图形
};// 派生类CRectPoint ———— 矩形加点
class SHAPEDLL_EXPORT CRectPoint:public CRectangle, public CPoint{
public:CRectPoint(const CPoint& pt1, const CPoint& pt2);CRectPoint(const CRectPoint& rc);virtual ~CRectPoint();double GetArea() const;bool ptIn(const CPoint& pt) const;bool inRect(const CRectangle& rc) const;void Draw(QPainter& painter) const;CRectPoint* Clone() const;CRectPoint& Move(int nOffsetX, int nOffsetY);
};// 图形管理器
class ShapeManager{
public:ShapeManager(){}~ShapeManager();void AddShape(CShape* pShape); //添加图形void DelShape(CShape* pShape); //删除图形void AddShape(vector<CShape*> pShapes); //批量添加图形void DelShape(vector<CShape*> pShapes); //批量删除图形void DelALL(); //清空CShape* ptIn(const CPoint& pt) const;bool InRect(const CRectangle& rc, vector<CShape*> pShapes);void Draw(QPainter& painter, vector<CShape*> pShapes);void Clone(vector<CShape*> pShapesIn, vector<CShape*> pShapesOut);void Move(int nOffsetX, int nOffsetY, vector<CShape*> pShapesIn);
private:vector<CShape*> m_pShapes;
};#endif // SHAPEDLL_H
// ShapeDll ———— shapedll.cpp#include "shapedll.h"ShapeDll::ShapeDll(){}// 图形
CShape::CShape():m_strName(NULL){}
CShape::CShape(const CShape& shape):m_strName(shape.m_strName){*this = shape;
}
CShape::~CShape(){}
// 面积为0
double CShape::GetArea() const{return 0;
}
bool CShape::ptIn(const CPoint& pt) const{return false;
}
bool CShape::inRect(const CRectangle& rc) const{return false;
}
CShape* CShape::Clone() const{return NULL;
}
CShape& CShape::Move(int nOffsetX, int nOffsetY){return *this; //返回本身
}// 点
CPoint::CPoint(int nPosX, int nPosY){ //构造函数m_nPosX = nPosX;m_nPosY = nPosY;
}
CPoint::CPoint(const CPoint& pt){ //拷贝构造函数m_nPosX = pt.m_nPosX;m_nPosY = pt.m_nPosY;
}
CPoint::~CPoint(){m_nPosX = 0;m_nPosY = 0;
}
double CPoint::GetArea() const{return 0;
}
bool CPoint::ptIn(const CPoint& pt) const{ //判断鼠标点命中return ((pt.m_nPosX-m_nPosX)*(pt.m_nPosX-m_nPosX) + (pt.m_nPosY-m_nPosY)*(pt.m_nPosY-m_nPosY) < 4);
}
bool CPoint::inRect(const CRectangle& rc) const{ //点是否在矩形内return (m_nPosX>rc.m_ptLT.m_nPosX && m_nPosX<rc.m_ptBR.m_nPosX && m_nPosY<rc.m_ptLT.m_nPosY && m_nPosY>rc.m_ptBR.m_nPosX);
}
CPoint* CPoint::Clone() const{return new CPoint(*this);//return new CPoint(m_nPosX, m_nPosY);
}
CPoint& CPoint::Move(int nOffsetX, int nOffsetY){m_nPosX += nOffsetX;m_nPosY += nOffsetY;return *this;
}void CPoint::Draw(QPainter& painter) const{painter.drawPoint(m_nPosX, m_nPosY);
}// 矩形
CRectangle::CRectangle(const CPoint& pt1, const CPoint& pt2){m_ptLT = pt1; m_ptBR = pt2;
}
CRectangle::CRectangle(const CRectangle& rc){m_ptLT = rc.m_ptLT;m_ptBR = rc.m_ptBR;
}
CRectangle::~CRectangle(){m_ptLT.m_nPosX = m_ptLT.m_nPosY = 0;m_ptBR.m_nPosX = m_ptBR.m_nPosY = 0;
}
double CRectangle::GetArea() const{return (m_ptBR.m_nPosX - m_ptLT.m_nPosX)*(m_ptLT.m_nPosY - m_ptBR.m_nPosY);
}
bool CRectangle::ptIn(const CPoint& pt) const{return (pt.m_nPosX>m_ptLT.m_nPosX && pt.m_nPosX<m_ptBR.m_nPosX && pt.m_nPosY<m_ptLT.m_nPosY && pt.m_nPosY>m_ptBR.m_nPosX);
}bool CRectangle::inRect(const CRectangle& rc) const{return (rc.m_ptLT.m_nPosX>m_ptLT.m_nPosX && rc.m_ptBR.m_nPosX<m_ptBR.m_nPosX && rc.m_ptLT.m_nPosY<m_ptLT.m_nPosY && rc.m_ptBR.m_nPosY>m_ptBR.m_nPosX);
}
void CRectangle::Draw(QPainter& painter) const{painter.drawRect(m_ptLT.m_nPosX, m_ptLT.m_nPosY, m_ptBR.m_nPosX-m_ptLT.m_nPosX, m_ptLT.m_nPosY-m_ptBR.m_nPosY);
}
CRectangle* CRectangle::Clone() const{return new CRectangle(*this);
}
CRectangle& CRectangle::Move(int nOffsetX, int nOffsetY){m_ptLT.m_nPosX += nOffsetX;m_ptLT.m_nPosY += nOffsetY;m_ptBR.m_nPosX += nOffsetX;m_ptBR.m_nPosY += nOffsetY;return *this;
}// 三角形
Triangle::Triangle(const CPoint& pt1, const CPoint& pt2, const CPoint& pt3){m_pt[0] = pt1;m_pt[1] = pt2;m_pt[2] = pt3;
}
Triangle::Triangle(const Triangle& rc){m_pt[0] = rc.m_pt[0];m_pt[1] = rc.m_pt[1];m_pt[2] = rc.m_pt[2];
}
Triangle::~Triangle(){m_pt[0].m_nPosX = m_pt[0].m_nPosY = 0;m_pt[1].m_nPosX = m_pt[1].m_nPosY = 0;m_pt[2].m_nPosX = m_pt[2].m_nPosY = 0;
}
//海伦公式计算三角形面积
double TriangleArea(const CPoint& pt1, const CPoint& pt2, const CPoint& pt3){double AB, BC, AC, P;AB = sqrt(pow(pt2.m_nPosX - pt1.m_nPosX,2)+ pow(pt2.m_nPosY - pt1.m_nPosY,2));AC = sqrt(pow(pt3.m_nPosX - pt1.m_nPosX,2)+ pow(pt3.m_nPosY - pt1.m_nPosY,2));BC = sqrt(pow(pt3.m_nPosX - pt2.m_nPosX,2)+ pow(pt3.m_nPosY - pt2.m_nPosY,2));P = (AB + AC + BC) / 2;return sqrt(P*(P-AB)*(P-AC)*(P-BC));
}double Triangle::GetArea() const{return TriangleArea(m_pt[0], m_pt[1], m_pt[2]);
}
bool Triangle::ptIn(const CPoint& pt) const{float S1, S2, S3, Ssum;S1 = TriangleArea(m_pt[0], m_pt[1], pt);S2 = TriangleArea(m_pt[0], m_pt[2], pt);S3 = TriangleArea(m_pt[1], m_pt[2], pt);Ssum = TriangleArea(m_pt[0], m_pt[1], m_pt[2]);if (0.0001 > fabs(Ssum - S1 - S2 - S3))//注意绝对值return true;elsereturn false;
}
bool Triangle::inRect(const CRectangle& rc) const{}
void Triangle::Draw(QPainter& painter) const{QPolygon polygon;polygon.setPoints(m_pt[0].m_nPosX, m_pt[0].m_nPosY,m_pt[1].m_nPosX, m_pt[1].m_nPosY,m_pt[2].m_nPosX, m_pt[2].m_nPosY);painter.drawPolygon(polygon);
}
Triangle* Triangle::Clone() const{return new Triangle(*this);
}
Triangle& Triangle::Move(int nOffsetX, int nOffsetY){m_pt[0].m_nPosX += nOffsetX;m_pt[0].m_nPosY += nOffsetY;m_pt[1].m_nPosX += nOffsetX;m_pt[1].m_nPosY += nOffsetY;m_pt[2].m_nPosX += nOffsetX;m_pt[2].m_nPosY += nOffsetY;return *this;
}// 矩形加点
CRectPoint::CRectPoint(const CPoint& pt1, const CPoint& pt2):CRectangle(pt1, pt2),CPoint((pt1.m_nPosX + pt1.m_nPosX)/2,(pt1.m_nPosY + pt1.m_nPosY)/2){
}CRectPoint::CRectPoint(const CRectPoint& rc):CRectangle(rc.m_ptLT,rc.m_ptBR),CPoint(rc.m_nPosX, rc.m_ptBR.m_nPosY){
}CRectPoint::~CRectPoint(){m_nPosX = 0;m_nPosY = 0;m_ptLT.m_nPosX = m_ptLT.m_nPosY = 0;m_ptBR.m_nPosX = m_ptBR.m_nPosY = 0;
}
double CRectPoint::GetArea() const{return CRectangle::GetArea();
}
bool CRectPoint::ptIn(const CPoint& pt) const{return CRectangle::ptIn(pt);
}
bool CRectPoint::inRect(const CRectangle& rc) const{return CRectangle::inRect(rc);
}
void CRectPoint::Draw(QPainter& painter) const{CRectangle::Draw(painter);CPoint::Draw(painter);
}
CRectPoint* CRectPoint::Clone() const{return new CRectPoint(*this);
}
CRectPoint& CRectPoint::Move(int nOffsetX, int nOffsetY){CRectangle::Move(nOffsetX,nOffsetY);CPoint::Move(nOffsetX,nOffsetY);
}// 图形管理器
void ShapeManager::AddShape(CShape* pShape){m_pShapes.push_back(pShape);
}
ShapeManager::~ShapeManager(){delete this;
}
void ShapeManager::DelShape(CShape* pShape){for(vector<CShape*>::iterator it = m_pShapes.begin();it != m_pShapes.end();it++){if((*it) == pShape){delete pShape;m_pShapes.erase(it);break;}}
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- jdk8 stream list分割 切割 分批次处理工具类
最近处理一个需求,需要将一批数据入库,处理的时候发现数据量超级大,于是就将批数据进行分割分批处理。 直接上码 package com.store.common.utils; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stre…...
2024/4/27 20:10:54 - 利用C语言求正整数n之前的所有素数之积
#include<stdio.h> int fun(int n) { int y1,i,j; for(i2;i<n;i) { //判断是否为素数 for(j2;j<i-1;j)//如果不存在j能够被i整除,i就是素数 { if(i%j0) break; } if(…...
2024/4/27 18:02:38 - RF的高级API、DOS下执行RF脚本
登录qq邮箱、操作表单、进入主界面 使用句柄: 通过句柄,跳转页面后可操作该页面 Get Window Handles:获取窗口的句柄 Select Window By Handle:切换到新窗口 注意:跳转窗口需要Select Window By Handle关键字,但是…...
2024/4/27 19:08:38 - 关于装饰模式的一次实践
我在这里展示的装饰模式只是简单的构造了一些函数,并没有真正的开发出实体软件,所以代码及其简单,就不进行注释。这里仅供参考,转载请原作者 某咖啡店的店员在卖咖啡时,可以根据客户需求添加各种配料,并根据…...
2024/4/27 1:52:43 - 原理图设计:元器件的放置与操作
添加原件库 安装完成后,选择刷新,也在三道杠图标 元器件的放置 添加器件到原理图中:1.选中直接拉到原理图中。 2.选中后右键,然后放置,可连续放置相同的器件 空格:选择器件后,器件按逆时针90旋…...
2024/4/27 20:50:02 - 二维数组总结
(一)二维数组的创建与初始化 1、二维数组的创建 int arr[3][4];//表示3行4列 char arr[3][5]; double arr[2][4]; int arr[3][4]; 2、二维数组的初始化 初始化——创建的同时给赋值 int arr[3][4] {1,2,3,4}; int arr[3][4] {{1,2},{4,5}}; int ar…...
2024/4/27 18:28:03 - weblogic 远程代码执行 (CVE-2020-14882)
weblogic 远程代码执行 (CVE-2020-14882)weblogic 远程代码执行 (CVE-2020-14882)0x01 漏洞描述0x02 影响范围0x03 漏洞复现工具0x04 漏洞修复weblogic 远程代码执行 (CVE-2020-14882) 0x01 漏洞描述 Ora…...
2024/4/19 23:27:08 - Swift 数组及常用方法
Swift 数组及常用方法 1. 创建数组 // 创建整型数组 var array1: [Int] [] // [] var arrya2: Array<Int> [1, 2, 3] // [1, 2, 3] var arryaInt [1, 2, 3] // [1, 2, 3] var array3 Array(arrayLiteral: 1, 2, 3) // [1, 2, 3]2. 快捷创建重复元素的数组 var arr…...
2024/4/20 1:35:03 - 21天好习惯要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和 python
def fn(a,b):sumanaj10for i in range(b-1):nn*jasumsumnreturn sum a,binput().split() sfn(int(a),int(b)) print(s)...
2024/4/15 5:26:45 - Process finished with exit code -1073741819 (0xC0000005)
今天遇到了一个比较奇怪的bug Process finished with exit code -1073741819 (0xC0000005) 问题是在我使用pycharm运行python时发生的 问题代码定位在了opencv的circle函数上 这个函数的用法是这样的 cv2.circle(background, position, radius, (b, g, r), -1) 一开始在网上…...
2024/4/26 11:38:00 - 用yum 命令来安装包时,yum list | grep xxx 找不到包
yum install epel-release...
2024/4/26 21:31:13 - c++(实验二)继承与多态
目录 继承的研究实验 三类继承方式中子类继承父类后的属性转换 基础理论 代码实现 结果截图 结论 实现额外内容 多继承 多继承的格式 继承与多继承同名问题 虚继承处理 菱形继承问题 代码简单研讨 有趣的细节问题 友元函数的继承中问题 关于“爸爸 的朋友”可…...
2024/4/5 6:24:47 - 电子测量技术(四)
第四章 时间与频率测量 4.1概述 一、频率的测量方法分类如下所示: 二、石英晶体振荡器 影响谐振器频率的主要因素为: 1.温度;2.老化;3.激励电平;4.核辐射及加速度影响 4.2频率与时间的测量原理 一、模拟测量原理 1.直接…...
2024/4/15 5:27:20 - 建立简单链接<a>标签
定义和用法 <a> 标签定义超链接,用于从一张页面链接到另一张页面。 <a> 元素最重要的属性是 href 属性,它指示链接的目标。 本例演示如何在 HTML 文档中创建链接。 <html lang"en"> <head><meta charset"…...
2024/4/19 12:45:18 - 2021-10-13 grpc开坑
2021-10-13 grpc开坑...
2024/4/27 11:46:28 - 特征重要性计算之LOFO与FLOFO
1. 引入 特征的重要性,即feature importance,使用sklearn自带的一些模型,就能计算出来。 比如RandomForest取feature_importance的用法如下: from sklearn.ensemble import RandomForestClassifier from sklearn.datasets impor…...
2024/4/19 21:13:19 - 使用多线程进行网图下载
1.下载commons-io-2.2.jar,放进项目中 public class LianXiThread extends Thread{private String url;private String name;//定义构造方法public LianXiThread(String url, String name){this.url url;this.name name;}//重写run()方法Overridepublic void ru…...
2024/4/25 18:24:23 - 利用滑动窗口对字符串进行操作
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 package list2;import list1.ListNode;import java.util.*;/*** Created with IntelliJ IDEA.** author : Future master* version : 1.0* Project : Java算法联系* Package : list2* ClassName…...
2024/4/25 9:51:56 - Mysql-统计用户的次日留存率
刷牛客网上遇到的一题,看了讨论区的内容,现在把自己的理解记录下来。 题目要求: 解题思路: 1.一个用户可能一天内存在多次答题记录,以device_id,date去重 select distinct q.device_id,q.date from question_practic…...
2024/4/24 8:53:40 - Elastic Search的父子查询之child query
文章目录 引子Has child query使用案例建立映射关系查询has_child 查询中重要的参数排序引子 日常生活中有很多类似嵌套查询的例子,举个有趣而且比较好理解的例子,比如我想要采访一个父亲,但是要求他的儿子有三个头六个胳膊。假如我们把我们所有人及其儿女的信息都录入到ES…...
2024/4/24 7:37:29
最新文章
- 重生之我是Nginx服务专家
nginx服务访问页面白色 问题描述 访问一个域名服务返回页面空白,非响应404。报错如下图。 排查问题 域名解析正常,网络通讯正常,绕过解析地址访问源站IP地址端口访问正常,nginx无异常报错。 在打开文件时,发现无法…...
2024/4/27 21:04:38 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - ChatGPT 初学者指南
原文:ChatGPT for Beginners 译者:飞龙 协议:CC BY-NC-SA 4.0 介绍 如果您一直关注新闻和趋势,您可能已经在某个地方读到或听到过,Sam Altman 的生成式人工智能平台 ChatGPT 已经将人工智能推向了一个新的高度 - 许多…...
2024/4/27 12:58:33 - 基于AI智能识别技术的智慧展览馆视频监管方案设计
一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览…...
2024/4/26 15:50:29 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57