一个旅游网站怎么做wordpress 源码剖析
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:01
当前位置: 首页 > news >正文
一个旅游网站怎么做,wordpress 源码剖析,seo建站教程,安阳网站建设开发目录
- 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承
- 继承和组合 1. 实现一个不能被继承的类 方法1…目录
- 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承
- 继承和组合 1. 实现一个不能被继承的类 方法1父类的构造函数私有子类构成必须调用父类的构造函数但是父类的构造函数私有后子类就不能调用了。那子类将无法实例化处对象。 如下代码所示 #includeiostream #includealgorithmusing namespace std; class Teacher { private:Teacher(){x 1;}int x; };class Student: public Teacher { public:Student(){ss 1;} private:int ss; }; 因为父类构造函数不能调用出错 方法2C11中新增了final关键字在父类类名后加上final修饰子类就不能继承了 代码如下 #includeiostream #includealgorithmusing namespace std; class Teacher final { public:Teacher(){x 1;} private:int x; };class Student: public Teacher { public:Student(){ss 1;} private:int ss; };不可以将其当做基类(父类) 2. 友元与继承 友元关系是不能继承的也就是说父类的友元不能访问子类私有和保护成员 代码如下 #includeiostream #includealgorithmusing namespace std; class Student;//提前声明否则友元函数定义找不到Student class Teacher {public:friend void playval( const Teacher t, const Student s);Teacher(int xx11){x xx;} private: //protected:int x; };class Student: public Teacher { public:Student():Teacher(11){ss 1;} private:int ss; };void playval(const Teacher t,const Student s ) {cout t.x endl;cout s.ss endl; }int main() {Teacher t(16);Student s;playval(t, s); } 结果如图不能找到s的私有成员 当然子类的友元也不能访问父类的保护和私有成员 如下代码所示 #includeiostream #includealgorithmusing namespace std; class Teacher {public:Teacher(int xx11){x xx;} private: //protected:int x; };class Student: public Teacher { public:friend void inputval(const Teacher t, const Student s);Student():Teacher(11){ss 1;} private:int ss; };void inputval(const Teacher t, const Student s) {cout t.x endl;cout s.ss endl; }int main() {Teacher t(16);Student s;inputval(t, s);return 0; } 结果如下图所示子类的友元函数找不到其父类的私有与保护成员 3.继承与静态成员 父类定义了static静态成员则整个继承体系里面只有一个这样的成员。无论派生出多少个子类都只有一个static成员实例。 如下代码所示 #includeiostream using namespace std;class Teacher { public:string _name;static int _count; }; int Teacher::_count 0; class Student : public Teacher { protected:int _stuNum; }; int main() {Teacher t;Student s;// 这⾥的运⾏结果可以看到⾮静态成员_name的地址是不⼀样的 // 说明⼦类继承下来了⽗⼦类对象各有⼀份 cout t._name endl;cout s._name endl;// 这⾥的运⾏结果可以看到静态成员_count的地址是⼀样的 // 说明⼦类和⽗类共⽤同⼀份静态成员 cout t._count endl;cout s._count endl;// 公有的情况下⽗⼦类指定类域都可以访问静态成员 cout Teacher::_count endl;cout Student::_count endl;return 0; } 运行结果如下 我们可以看到子类对象中的_name与父类对象中的_name地址不同而子类对象与父类对象的_count地址是相同的。说明父类对象与子类对象共用一个静态成员。 4.多继承及其菱形继承问题 (1). 继承模型 单继承一个子类只有一个直接父类时称这个继承关系为单继承。 如下图 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承多继承对象在内存中的模型是 先继承的父类在前面后继承的父类在后面子类成员在最后面。 如下图 在内存中的分布如下 菱形继承菱形继承是多继承的一种特殊情况。菱形继承的问题从下面的对象成员模型构造可以看出菱形继承有数据冗余和二义性的问题在Assistant的对象中Person成员会有两份。支持多继承就一定会有菱形继承实践中我们尽量不设计出菱形继承这样的模型 代码演示 #includeiostream #includestringusing namespace std; class Person { public:string _name; // 姓名 }; class Student : public Person { protected:int _num; }; class Teacher : public Person { protected:int _id; }; class headmaster : public Student, public Teacher { protected:string _Course; }; 上述代码即为一个菱形继承 int main() {// 编译报错: 对“_name”的访问不明确 headmaster a;a._name peter;return 0; } 这样调用编译会报错 编译器不知道调用的是哪个父类中的_name 我们可以通过显式指定访问那个父类的成员来解决二义性的问题但是无法解决数据冗余的问题 int main() {//a.Student::_name xxx;a.Teacher::_name yyy;return 0; } (2). 虚继承 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系在Student和Teacher的继承Person时使用虚拟继承即可解决问题。但是要注意虚拟继承不要在其他地方去使用。 using namespace std;class Person { public:string _name; // 姓名 }; class Student : virtual public Person { protected:int _num; }; class Teacher : virtual public Person { protected:int _id; }; class headmaster : public Student, public Teacher { protected:string _Course; };int main() {headmaster h;h._name lisi;cout h._name endl;h.Student::_name l;cout h._name endl;h.Teacher::_name s;cout h._name endl;cout h._name endl;cout h.Student::_name endl;cout h.Teacher::_name endl;return 0; } 输出结果如下 可以看到这三个在内存中用了一个地址空间这样解决了二义性和数据冗余的问题 (2.1)虚继承解决数据冗余和二义性的原理 如下代码 #includeiostream #includestringusing namespace std;class Person { public:int a; }; class Student : virtual public Person { public:int _num; }; class Teacher : virtual public Person { public:int _id; }; class headmaster : public Student, public Teacher { public:int test; };int main() {headmaster h;h.Student::a 1;h.Teacher::a 2;h._num 3;h._id 4;h.test 5;return 0; } 在内存中如下所示 我们上面提到过多继承中先继承的父类在前面后继承的父类在后面子类成员放在最后面。我们这里可以看出headmaster对象中将Person放到了对象组成的最下面这个Person同时属于Student和Teacher那Student和Teacher如何去找到公共的Person呢 这里是通过它们的两个指针指向的一张表。这两个指针叫虚基表指针这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到Person。 内存2是p1指向的地址内存3是p2指向的地址它们下面指针的指向是相同的 Teacher和Student自己定义的对象也可以通过这样来找到Person 如下 int main() {Teacher t;Student s;t.a 1;cout t.a endl;s.a 2;cout t.a endl;cout s.a endl;return 0; } 结果为 (3). 多继承中指针偏移问题 关于下面程序说法正确的是 A: p1p2p3 B: p1p2p3 C: P1p3!p2 D: p1!p2!p3 class Base1 { public: int _b1; }; class Base2 { public: int _b2; }; class Derive : public Base1, public Base2 { public: int _d; }; int main() {Derive d;Base1* p1 d;Base2* p2 d;Derive* p3 d;return 0; } 先继承的父类在前面后继承的父类在后面子类成员在最后面所以p1与p3指向相同 选C (4). IO库中的菱形虚拟继承 templateclass CharT, class Traits std::char_traitsCharT class basic_ostream : virtual public std::basic_iosCharT, Traits {}; templateclass CharT, class Traits std::char_traitsCharT class basic_istream : virtual public std::basic_iosCharT, Traits {};5. 继承和组合 1. public继承是一种is-a的关系。也就是说每个子类对象都是一个父类对象。 2. 组合是一种has-a的关系。假设B组合了A每个B对象中都有一个A对象。 3. 继承允许你根据父类的实现来定义子类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言在继承方式中父类的内部细节对子类可见。继承一定程度破坏了父类的封装父类的改变对子类有很大影响。子类和父类之间的依赖关系很强耦合度高。 4. 对象组合时类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse)因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系耦合度低。优先使用对象组合有助于你保持每个类被封装。 5. 优先使用组合而不是继承。实际尽量多去用组合组合的耦合度低代码维护性好。不过也不那么绝对类之间的关系适合继承(is-a)那就用继承另外要实现多态也必须要继承。类之间的关系既适合用继承(is-a)也适合用组合(has-a)那就用组合。 6. 很多人说C语法复杂其实多继承就是一个体现。有了多继承就存在菱形继承有了菱形继承就有菱形虚拟继承底层实现就很复杂性能也会由一些损失所以最好不要设计出菱形继承。多继承可以认为是C的缺陷之一后来的一些编程语言都没有多继承比如Java 例如汽车类(car) 和 轮胎类(tire) 适合使用组合方式实现动物类可以作为狗类的父类(继承思想) 这篇就到这里啦づ3づ╭❤
- 上一篇: 一个空间怎么放2个网站网站后台添加文字
- 下一篇: 一个女装店网站建设的策划模板免费自建网站工具
相关文章
-
一个空间怎么放2个网站网站后台添加文字
一个空间怎么放2个网站网站后台添加文字
- 技术栈
- 2026年04月20日
-
一个空间可以做几个网站吗wordpress 视频 广告插件
一个空间可以做几个网站吗wordpress 视频 广告插件
- 技术栈
- 2026年04月20日
-
一个空间可以做多少个网站wordpress 上传大文件
一个空间可以做多少个网站wordpress 上传大文件
- 技术栈
- 2026年04月20日
-
一个女装店网站建设的策划模板免费自建网站工具
一个女装店网站建设的策划模板免费自建网站工具
- 技术栈
- 2026年04月20日
-
一个企业可以做多个网站吗河北二级建造师考试最新消息
一个企业可以做多个网站吗河北二级建造师考试最新消息
- 技术栈
- 2026年04月20日
-
一个企业可以做多个网站吗建设河南网站
一个企业可以做多个网站吗建设河南网站
- 技术栈
- 2026年04月20日
