例子:
#include<iostream> using namespace std; class BasePage { public: void header() { cout << "公共头部" << endl; } footer() { cout << 公共尾部 endl; } }; class Java: BasePage{ content() { cout << java相关视频 endl; } }; class Cpp :c++相关视频 test() { Java java; java.header(); java.content(); java.footer(); Cpp cpp; cpp.header(); cpp.content(); cpp.footer(); } int main() { test(); system(pause"); return 0; }
将公有的抽取出来在作为父类,子类继承父类之后就拥有了父类的公有方法。
首先需明确:子类不能访问父类的私有属性和方法。
继承方式有:
公共继承:子类所有属性和方法和修饰符和父类中保持一致;
保护继承:子类所有属性和方法为protected;
私有继承:子类所有属性和方法为private;
继承对象模型:
#include<iostream> Base{ a; protected b; private c; }; class Son : Base { d; }; test() { cout << Son所占字节数为:" << sizeof(Son) << endl; } ; }
输出:
我们发现父类的所有属性都被继承了,但是private类型的属性在子类中却不能被访问。
继承中构造和析构顺序:父类构造、子类构造、子类析构、父类析构。
继承中同名处理方式:访问子类同名成员,直接访问;访问父类同名成员,需要加作用域;
#include<iostream> a; Base() { a = 10; } show() { cout << Base endl; } }; Base { : Son() { a = 20Son test() { Son s; cout << s.a << endl; cout << s.Base::a << endl; s.show(); s.Base::show(); } ; }
输出:
继承中同名静态成员处理:与同名成员处理一致,只不过通过类名直接访问而不是对象访问时需要加各自的作用域,即
Base::a;
Son::a;
Son::Base::a;
多继承语法:c++可以有多重继承。class A:public B,public C{};
菱形继承:两个子类同时继承一个基类;又有某个类同时继承这两个子类;
存在两个问题:
- 同名成员:利用作用域区分访问即可
- 最后一个类继承了两份基类的数据:使用virtual关键字,进行虚继承
#include<iostream> a; }; class Son1 : Base {}; class Son2 :class End :public Son1, Son2 {}; test() { End e; e.Son1::a = ; e.Son2::a = ; cout << e.Son1::a << endl; cout << e.Son2::a <<; }
此时输出:
加入了virtual之后:(vbptr虚基类指针,通过偏移量找到唯一的一份数据)
#include<iostream> class Son1 :virtual class Son2 :; }
此时输出:就只有一份数据了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。