例子:
#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{};
菱形继承:两个子类同时继承一个基类;又有某个类同时继承这两个子类;
存在两个问题:
#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;
}
此时输出:就只有一份数据了