c++之继承
时间:2022-07-23
本文章向大家介绍c++之继承,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
例子:
#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;
}
此时输出:就只有一份数据了
- 【David Silver 深度强化学习教程代码实战07】 DQN的实现
- AutoMapper随笔记
- 简析.NET Core 以及与 .NET Framework的关系
- 1627: [Usaco2007 Dec]穿越泥地
- 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
- 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
- Polyspace不认识Interrupt,肿么办?
- 1639: [Usaco2007 Mar]Monthly Expense 月度开支
- 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通
- 1642: [Usaco2007 Nov]Milking Time 挤奶时间
- 1625: [Usaco2007 Dec]宝石手镯
- 1613: [Usaco2007 Jan]Running贝茜的晨练计划
- 1677: [Usaco2005 Jan]Sumsets 求和
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法