例子:
#include<iostream> using namespace std; class BasePage { public: void header() { cout << "公共头部" << endl; } void footer() { cout << "公共尾部" << endl; } }; class Java:public BasePage{ public: void content() { cout << "java相关视频" << endl; } }; class Cpp :public BasePage { public: void content() { cout << "c++相关视频" << endl; } }; void 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> using namespace std; class Base{ public: int a; protected: int b; private: int c; }; class Son :public Base { int d; }; void test() { cout << "Son所占字节数为:" << sizeof(Son) << endl; } int main() { test(); system("pause"); return 0; }
输出:
我们发现父类的所有属性都被继承了,但是private类型的属性在子类中却不能被访问。
继承中构造和析构顺序:父类构造、子类构造、子类析构、父类析构。
继承中同名处理方式:访问子类同名成员,直接访问;访问父类同名成员,需要加作用域;
#include<iostream> using namespace std; class Base{ public: int a; Base() { a = 10; } void show() { cout << "Base" << endl; } }; class Son :public Base { public: int a; public: Son() { a = 20; } void show() { cout << "Son" << endl; } }; void test() { Son s; cout << s.a << endl; cout << s.Base::a << endl; s.show(); s.Base::show(); } int main() { test(); system("pause"); return 0; }
输出:
继承中同名静态成员处理:与同名成员处理一致,只不过通过类名直接访问而不是对象访问时需要加各自的作用域,即
Base::a;
Son::a;
Son::Base::a;
多继承语法:c++可以有多重继承。class A:public B ,public C{};
菱形继承:两个子类同时继承一个基类;又有某个类同时继承这两个子类;
存在两个问题:
- 同名成员:利用作用域区分访问即可
- 最后一个类继承了两份基类的数据:使用virtual关键字,进行虚继承
#include<iostream> using namespace std; class Base{ public: int a; }; class Son1 :public Base {}; class Son2 :public Base {}; class End :public Son1,public Son2 {}; void test() { End e; e.Son1::a = 10; e.Son2::a = 20; cout << e.Son1::a << endl; cout << e.Son2::a << endl; } int main() { test(); system("pause"); return 0; }
此时输出:
加入了virtual之后:(vbptr虚基类指针,通过偏移量找到唯一的一份数据)
#include<iostream> using namespace std; class Base{ public: int a; }; class Son1 :virtual public Base {}; class Son2 :virtual public Base {}; class End :public Son1,public Son2 {}; void test() { End e; e.Son1::a = 10; e.Son2::a = 20; cout << e.Son1::a << endl; cout << e.Son2::a << endl; } int main() { test(); system("pause"); return 0; }
此时输出:就只有一份数据了