支付宝接口 网站备案做酒店网站有哪些目录

当前位置: 首页 > news >正文

支付宝接口 网站备案,做酒店网站有哪些目录,大学生网页设计作业成品,我想做服装网站怎么做目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1构造函数调用顺序#xff1a;5.2析构函数调用顺序#xff1a;5.3调… 目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1构造函数调用顺序5.2析构函数调用顺序5.3调用关系 六、继承和组合 引言 今天学习继承继承Inheritance 是面向对象编程中的一种核心概念它允许一个类子类从另一个类父类派生继承父类的属性和方法。 一、定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段它允许程序员在保持原有类特性的基础上进行扩展增加功能这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用继承是类设计层次的复用。 我们通过一个简单的代码示例来说明下 class Person { public :void print(){cout name: _name id: _id endl;} protected:string _name per;int _id 134; };class Student :public Person { protected:int _stuid; };在上述代码中Student 类就是继承了父类Person,继承父类的成员成员函数成员变量都会变成子类的一部分。父类person就是基类子类Student也就是派生类。 二、继承定义格式 2.1定义格式 2.2继承关系和访问限定符 继承方式有public 继承、protected 继承、private 继承。访问限定符有public 访问、protected访问、 private访问。 2.3继承后子类访问权限 类成员/继承方式public 继承基类public派生类的public成员基类 protected派生类的protected成员基类 private派生类中不可见 总 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私 有成员还是被继承到了派生类对象中但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。基类private成员在派生类中是不能被访问如果基类成员不想在类外直接被访问但需要在 派生类中能访问就定义为protected。可以看出保护成员限定符是因继承才出现的。实际上面的表格我们进行一下总结会发现基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 Min(成员在基类的访问限定符继承方式)public protected private。使用关键字class时默认的继承方式是private使用struct时默认的继承方式是public不过最好显示的写出继承方式。在实际运用中一般使用都是public继承几乎很少使用protetced/private继承也不提倡使用protetced/private继承因为protetced/private继承下来的成员都只能在派生类的类里面使用实际中扩展维护性不强 三、基类和派生类赋值转换 派生类对象 可以赋值给基类的对象 / 基类的指针 / 基类的引用 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。 相反 基类成员无法赋值给派生类成员。 如 class Person { protected :string _name; // 姓名string _sex; // 性别int _age; // 年龄 }; class Student : public Person { public :int _No; // 学号 }; void Test () {Student s ;// 1.子类对象可以赋值给父类对象/指针/引用Person p s ;Person* p1 s;Person p2 s;//2.基类对象不能赋值给派生类对象// 3.基类的指针可以通过强制类型转换赋值给派生类的指针p1 sStudent* s1 (Student*)pp; // 这种情况转换时可以的。s1-_No 10; }四、继承的作用域 继承的作用域决定了从基类继承到派生类的成员包括变量和方法的访问权限。 在c继承体系中基类和派生类都有独立的作用域。当子类和父类中有同名成员子类成员将屏蔽父类对同名成员的直接访问这种情况叫隐藏也叫重定义。在子类成员函数中可以使用 基类::基类成员 显示访问 4.1同名变量 在下面代码中基类和派生类都有一个_num这个变量。 class Person { protected:string name xiaolizi;int _num 111;}; y隐藏/重定义 子类和父类有同名成员 class Student :public Person { public:void print(){cout 名字: name endl;cout _num endl;} protected:int _num 333; }; int main() {Student s;s.print(); }输出结果 若果想要打印基类的_num则只需要在print函数里面加入限定符: void print(){cout 名字: name endl;cout person:: _num endl;}4.2同名函数 如果基类和派生类都出现名字相同的函数会发现什么 如下 class A { public:void fun(){cout func() endl;} }; class B : public A { public:void fun(int i){A::fun();cout func(int i)- iendl;} }; void Test() {B b;b.fun(2); }输出结果
B中的fun和A中的fun不是构成重载因为不是在同一作用域 B中的fun和A中的fun构成隐藏成员函数满足函数名相同就构成隐藏。 要访问A中的func函数,需要加 :: 限定符 五、派生类的默认成员构造函数 在类中有六个默认成员函数分别是默认构造函数、拷贝构造函数、拷贝赋值运算符、析构函数、移动构造函数、移动赋值运算符一起看看 5.1构造函数调用顺序 创建派生类对象时从最顶层的基类开始逐层向下调用构造函数直到派生类。 接着按照派生类中成员变量的声明顺序初始化成员变量若成员是对象则调用其构造函数。 最后执行派生类构造函数体中的代码。
5.2析构函数调用顺序 销毁派生类对象时首先调用派生类的析构函数。 然后按照成员变量声明的逆序调用成员变量的析构函数若成员是对象。 最后从最顶层的基类开始逐层向上调用析构函数直到派生类的基类
代码演示 #include iostream using namespace std;class Base { public:Base() { cout Base constructor\n; }~Base() { cout Base destructor\n; } };class Derived : public Base { public:Derived() { cout Derived constructor\n; }~Derived() { cout Derived destructor\n; } };int main() {Derived d;return 0; } 运行结果 Base constructor Derived constructor Derived destructor Base destructor 在上述代码中 当对象 d 被创建时首先调用 Base 类的构造函数然后调用 Derived 类的构造函数。 当对象销毁时首先调用 Derived 类的析构函数最后调用 Base 类的析构函数。 构造调用总结 基类构造函数首先调用。成员对象构造函数按成员声明的顺序调用。派生类构造函数最后调用 析构调用总结 成员对象析构顺序按照它们在类定义中的声明顺序销毁。继承关系析构函数的调用顺序是先派生类后基类。 5.3调用关系 派生类的构造函数必须调用基类的构造函数来初始化基类的成员。如果基类没有默认的构造函数则必须在派生类构造函数的初始化列表中显式调用基类的一个构造函数。派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才保证派生类对象先清理派生类成员再清理基类成员的顺序。 示意图如下
六、继承和组合 组合是通过在类中包含其他类的对象来实现的通常是通过成员变量来持有其他对象的实例。这种方法强调“拥有”关系has-a。继承则是is-a关系。 组和用法 #include iostream using namespace std;// 类 Engine发动机 class Engine { public:void start() {cout Engine starting… endl;} };// 类 Car汽车 class Car { private:Engine engine; // Car 类拥有 Engine 类的对象 public:void drive() {engine.start(); // 使用 Engine 类的功能cout Car is driving… endl;} };int main() {Car car;car.drive(); // 调用 Car 类的方法间接使用 Engine 类的方法return 0; } 在上述代码中 Car 类组合了一个 Engine 对象作为其成员变量。Car 类的 drive() 方法中首先调用 Engine 类的 start() 方法然后输出 “Car is driving…”。 注 实际尽量多去用组合。组合的耦合度低代码维护性好。不过继承也有用武之地的有些关系就适合继承那就用继承另外要实现多态也必须要继承。类之间的关系可以用继承可以用组合就用组合。