C++基础语法----类的继承

四、继承的构造与析构:

=============================================================================

1 构造函数调用顺序


基类>组合类>自己;(如果级别相同那么顺序由定义顺序决定)

析构与构造相反;

2 如果基类没有不含参的构造函数,那么必须在构造子类对象时对其初始化


语法(子类的构造函数对父类属性进行初始化):

子类名 (参数列表) :基类1名(参数列表),基类2名)(参数列表){函数体};

⚠️:在继承中子类仅仅将父类的属性与方法继承了下来,千万不要认为

子类的对象上面还有一个父类;

⚠️:子类对象与父类对象的关系:(符号代表属性与变量)

*** 爷爷类//代代相传代代变强变多【只有三颗*】

***@@@ 爸爸类 【比爷爷类多出三个@】

***@@@$$$ 儿子类 【儿子类有更多的属性与方法】

3 子类初始化基类属性的方法


两个b是同一个b,可以直接初始化父类的属性

只有在基类没有无参构造函数的时候这么写

可以多传几个参数,看个人需求。参数要在子类的构造函数参数列表内。

在这里插入图片描述

4 示例代码


//继承中的构造与析构函数

//构造函数调用顺序是 基类>嵌套类>自己,析构相反

#include

using namespace std;

class A {

private:

int a;

public:

A(int a ) {

this->a = a;

cout << “这里是A的构造函数” << endl;

}

void print() {

cout << "A: "<<a << endl;

}

~A() {

cout << “这里是A的析构函数” << endl;

}

};

class B :public A{

private:

int b;

public:

B(int b=0) :A(b){//要在B构造函数的初始化列表对A进行初始化,

this->b = b;

cout << “这里是B的构造函数” << endl;

}

~B() {

cout << “这里是B的析构函数” << endl;

}

};

int main_01() {

B b1(2);

b1.print();//b1对象既有类A的属性,又有类B的属性;输出的是B类的print

b1.A::print();//输出类A的print;

return 0;

}

五、赋值兼容原则:

===========================================================================

子类可以初始化父类:

初始化时调用父类的拷贝构造函数;

父类的指针与引用可以指向子类;

子类有父类没有的方法,并且可以完成父类的工作;

值得注意的是:

在基类的指针或者引用与子类的对象关联时就好像指针只与子类对象

的一部分进行了关联;仅仅是用子类对象的一部分属性

初始化出来了基类的对象,并且该对象中没有子类的成员属性;

具体实现方法如下:

//基类的指针与引用可以指向子类的对象;

//子类的对象可以对父类进行初始化;

#include

using namespace std;

class A1 {

public:

int a;

int b;

public:

void print() {

cout << “A1 A1:”<<" : "<<a<<b << endl;

}

};

class B1:public A1 {

public:

int a;

int b;

public:

B1(int a, int b) {

this->a = a;

this->b = b;

A1::a = 100;

A1::b = 200;

}

void print() {

cout << " " << B1::a<<" "<< B1::b << endl;

cout << “B1 B1”<<" : "<<a<<b << endl;

}

int getA() {

return a;

}

};

int main_02() {

B1 b1(1, 2);

A1 a1= b1;//(兼容赋值原则)(子类直接给父类的对象赋值)

A1* p = NULL;

p = &b1;//将子类的地址赋给基类的指针;

A1& q = b1;//基类还可以做子类的引用;

// B1* q = NULL;

// q = &a1;也不可以进型子类的指针指向基类的对象

// B1 b2 = a1;可以将子类的对象赋值给父类的对象:不能反向操作;因为子类对象有父类没有的东西;

//分割线*******************************************

cout << “” << endl;

cout << q.a << endl;

q.print();//打印的还是A类的东西;

cout << “-----------------------------0-----” << endl;

p->print();//输出的是A类内的元素;并且调用的是A类的打印函数;

cout << p->a << endl;//打印A类的元素

b1.print();//只有这句话调用了b的打印函数

a1.print();//没有显示的对a1成员属性进行操作:但输出了100 200;如果将a1=b1去掉则输出乱码:

//由此可知b1中的A1::a与A1::b对a1中的a,b进行了初始化;

return 0;

}

六、成员属性或者成员方法重名问题:

===================================================================================

子类与父类难免有些成员属性会重名;由于有作用域的限制子类继承时可以将同名的属性与方法继承下来;

只需在使用时稍加注意即可:

默认情况子类在调用重名属性时会先调用自己的属性;

语法:子类对象名.重名函数;

想要调用基类的是重名属性的方法:(使用域作用符):

语法:子类对象名.基类名::重名属性;【::是域作用符】

七、多继承:

========================================================================

在C++中一个类可以继承多个类;并且拥有他们的属性与方法;

但有时候会产生二义性

情况一、虚继承解决构造函数的二义性


ABCD四个类继承如图所示:

A //A是BC的基类

/ \ //BC继承A后可能分别会以不同的方式初始化A

【假设A没有无参构造函数】必须由B或者C进行初始化

B C

\ /

D //D在同时继承BC,如果初始化D的对象时,

调用B还是C的构造函数去初始化A?

这就使编译器十分矛盾;产生了二义性;

解决方法;利用虚继承:virtual关键字在继承时进行限定;

【讲多态的时候会着重讲virtual关键字】

具体实现方法如下:

#include

using namespace std;

class AA {

public:

int a;

AA(int a = 0) {

this->a = a;

}

void print() {

cout << " AA" << endl;

}

};

class BB:virtual public AA {//

public:

int b;

BB(int b = 0):AA(1) {

this->b = b;

}

void print() {

cout << “BB” << endl;

前端资料汇总

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++是一种通用的高级编程语言,它支持面向对象编程和基于类的编程范式。下面是一些关于C++基础语法和面向对象编程的重要概念: 1. 数据类型:C++提供了多种数据类型,包括整数类型(int,long等),浮点数类型(float,double等),字符类型(char),布尔类型(bool)等。 2. 变量和常量:在C++中,可以使用关键字来声明和定义变量。变量是用于存储数据的容器,在使用之前需要先声明其类型。常量是不可修改的值,可以使用关键字const来声明。 3. 控制流语句:C++提供了多种控制流语句,包括条件语句(if-else语句,switch语句),循环语句(for循环,while循环,do-while循环)等。这些语句允许根据条件执行不同的代码块或者重复执行一段代码。 4. 函数:函数是完成特定任务的代码块,可以在程序中多次调用。C++中的函数可以有参数和返回值。函数的参数用于接收传入的值,返回值用于向调用者返回结果。 5. 数组:数组是一种用于存储相同类型数据的集合。在C++中,可以使用方括号([])来声明和访问数组。数组的元素可以通过索引进行访问,索引从0开始。 6. 类和对象:C++支持面向对象编程,其中类是一种自定义数据类型,用于封装数据和函数。类中的数据成员表示对象的属性,函数成员表示对象的行为。对象是类的实例,可以通过创建对象来访问类中的成员。 7. 继承和多态:C++中的继承允许一个类从另一个类派生,从而继承其属性和方法。派生类可以添加额外的属性和方法,也可以重写基类中的方法。多态性允许使用基类指针或引用来调用派生类的方法。 以上是C++基础语法和面向对象编程的一些重要概念。掌握这些概念可以帮助你编写更加灵活和可扩展的C++程序。如果你有具体的问题或者需要更深入的讨论,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值