派生类

深入理解C++中public、protected及private用法

廉价感情. 提交于 2020-02-17 01:54:05
这篇文章主要介绍了C++中public、protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。 这里我们首先要明白下面几点。 1.类的一个特征就是 封装 ,public和private作用就是实现这一目的。所以: 用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。 2.类的另一个特征就是 继承 ,protected的作用就是实现这一目的。所以: protected成员可以被派生类对象访问,不能被用户代码(类外)访问。 现来看看如下示例: #include<iostream> #include<assert.h> using namespace std; class A{ public: int a; A(){ //构造函数 a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //正确 cout << a1 << endl;

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

多态、虚函数

半世苍凉 提交于 2020-02-13 23:38:38
1.( 1)派生类和基类的成员函数同名的处理 #include<iostream> #include<string> using namespace std; class A { private: int a; public: A(int x) { a = x; } void setA(int x) { a = x; } void show() { cout << "基类A=" << a << endl; } }; class C :public A { //公有继承 A private: int c; public: C(int a, int b, int c1) :A(a) { c = c1; } //派生类构造函数 void setC(int x, int y) { c = x; } void showC() { cout << "c=" << c << endl; } /*void show() { cout << "派生类C=" << c << endl; }*/ void show() { A::show(); cout << "派生类C=" << c << endl; } }; void main() { A ta(12); C tc(1, 2, 3); ta.show(); tc.show(); } ▲main函数中的ta.show() 和tc.show(

构造/析构/赋值运算

左心房为你撑大大i 提交于 2020-02-12 17:33:29
条款05:了解C++默默编写并调用哪些函数   如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数,默认构造函数和析构函数主要给编译器一个地方用来放置“藏身幕后”的代码,像是调用base classes和non-static成员变量的构造函数和析构函数。所有这些函数都是public且inline,编译器产生出来的析构函数是non-virtual,除非这个class的base class自身声明有virtual析构函数。   惟有当这些函数被需要(被调用),它们才会被编译器创建出来。即有需求,编译器才会创建它们。   至于拷贝构造函数和拷贝赋值操作符,编译器创建的版本只是单纯地将来源对象的每一个非静态成员变量拷贝到目标对象。   如一个类声明了一个构造函数(无论有没参数),编译器就不再为它创建默认构造函数。   编译器生成的拷贝赋值操作符:对于成员变量中有指针,引用,常量类型,我们都应考虑建立自己“合适”的拷贝赋值操作符。因为指向同块内存的指针是个潜在危险,引用不可改变,常量不可改变。 请记住:   编译器可以暗自为类创建默认构造函数、拷贝构造函数、拷贝赋值操作符,以及析构函数。 条款06:若不想使用编译器自动生成的函数,就该明确拒绝   通常如果你不希望类支持某一特定技能,只要不说明对应函数就是了。但这个策略对拷贝构造函数和拷贝赋值操作符却不起作用。因为编译器会

【C++】为什么含有纯虚函数的类无法定义对象

跟風遠走 提交于 2020-02-11 20:38:42
纯虚函数的地址为空,无法分配内存,纯虚成员函数对类是没有意义的,失去了普通类的数据和方法绑定于同一对象中的意义,因此无法构造对象,只能由其派生类继承这些成员函数并实现,才能构造派生类对象。 纯虚成员函数仅起到了定义接口的作用。 来源: https://www.cnblogs.com/skullboyer/p/12296361.html

C++学习笔记7

瘦欲@ 提交于 2020-02-11 15:56:10
目录 六、动态联编与虚函数 1、联编的概念 2、静态联编 3、动态联编 4、虚函数 5、虚析构函数 6、纯虚函数和抽象类 六、动态联编与虚函数 1、联编的概念 联编是指一个计算机程序自身彼此关联(使一个源程序经过编译、 连接, 成为一个可执行程序) 的过程, 在这个联编过程中, 需要确定程序中的操作调用(函数调用) 与执行该操作(函数) 的代码段之间的映射关系, 按照联编所进行的阶段不同, 可分为静态联编和动态联编。 2、静态联编 静态联编又称静态束定、 早期联编、 前期联编。 静态联编是指联编工作是在程序编译链接阶段进行的, 静态联编又称早期联编, 因为这种联编是在程序开始运行之前完成的。 在程序编译阶段进行的这种联编又称静态束定, 在编译时就解决了程序中的操作调用与执行该操作代码间的关系, 确定这种关系又被称为束定, 编译时束定又称为静态束定。 静态联编就是, 编译器在程序运行前就知道调用什么函数做什么事 。 静态联编特点: 速度快效率高 。 3、动态联编 动态联编又称动态关联、 动态束定、 后期联编、 晚期联编。 动态联编是指编译程序在编译阶段并不能确切地知道将要调用的函数, 只有在程序执行时才能确定将要调用的函数, 为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行, 这种在程序运行时进行的联编工作被称为动态联编。 C++规定: 动态联编是在 虚函数

C# base派生类的构造函数

↘锁芯ラ 提交于 2020-02-11 01:36:47
1,在子类中调用父类的默认构造函数(无参)(会先调用父类的,然后是子类的) public class MyDerivedClass{ public MyDerivedClass():base(){ //do something } } 在这里 :base()可以直接不写,因为默认会调用父类中的默认构造函数 2,调用有参数的构造函数 public class MyDerivedClass{ public MyDerivedClass(string name):base(name){ //do something } } 案例: //父类 class BaseClass { private int x; protected int z; public BaseClass() { Console.WriteLine("base class 无参构造函数"); } public BaseClass(int x) { this.x = x; Console.WriteLine("x赋值完成"); } } //派生类 class DerivedClass:BaseClass { private int y; public DerivedClass()//调用父类中无参的构造函数 当我们没有在子类的构造函数中显示声明调用父类的构造函数,默认会调用父类中的无参构造函数 { Console

C++基类和派生类的构造函数

流过昼夜 提交于 2020-02-08 20:30:15
派生类不能继承基类的构造函数,若想通过派生类来对基类的private的变量成员进行初始化则需要:    通过派生类的构造函数来调用基类的构造函数完成基类成员变量的初始化. 看下面的例子: #include <iostream> #include<string> using namespace std; class People { private: char *m_name; int m_age; public: People(char*, int); }; People::People(char* name,int age):m_name(name),m_age(age){} class Student : public People { //此处的public是将其基类:People 的成员以其在People内的级别于Student中继承, //即成员在基类中是什么级别就以什么级别被派生类继承.protected则是将public级别的成员改为protected被派生类继承,private则是 //全变成private被派生类继承 private: float m_score; public: Student(char* name, int age, float score); //void display(); }; Student::Student(char*name

c++ -- 多态(类)

↘锁芯ラ 提交于 2020-02-07 02:12:58
假期 2020.02 .06 学习资源来源于中国MOOC以及c语言中文网 前言 c++之所以是面向对象的是因为该语言既支持类也支持多态,而多态是什么呢? 定义 多态就是同一个操作作用于不同的对象会产生不同的结果。这个操作一般指的是函数的调用等等。 标准定义 是对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。 虚函数 :在成员函数前加 virtual 即可生成虚函数。注意虚函数只能在类的内部定义成员函数时使用,不能在类外部写成员函数时使用,构造函数与静态成员都不能是虚函数。 多态类 :包含虚函数的类称为“多态类”。 如何构成多态 常判断条件是 有继承关系 继承关系中有同名的虚函数,并且是覆盖关系 存在基类的指针,指向派生类的虚函数,或者引用 那么什么时候声明虚函数呢? 成员函数所在的类是否是基类 成员函数在继承后是否会被新定义或者更改,是的话,需要;否则,不需要。 多态应用 举一个指针类型的例子: 注意:多态的语句调用哪个类的成员函数是在运行时才能确定的,编译时不能确定。多态的函数调用语句被称为是“动态联编”

c++之类的继承入门

∥☆過路亽.° 提交于 2020-02-06 03:25:46
c++ — 类的继承入门 继承与派生概述: 1、保持已有类的特性而构造新类的过程称为 继承 ;在已有类的基础上新增自己的特性而产生新类的过程称为 派生 2、被继承的已有类称为 基类 (或父类) 3、派生出的新类称为派 生类 (或子类) 4、直接参与派生出某类的基类称为 直接基类 5、基类的基类甚至更高层的基类称为 间接基类 继承的目的: 实现设计与代码的重用 派生的目的: 原程序无法解决新问题时,需对原程序进行改造 单继承时派生类定义: class 派生类名:继承方式 基类名 { 成员声明; } 多继承时派生类定义: class 派生类名:继承方式1 基类名1,继承方式2 基类名2… … { 成员声明; } 注:每一个继承方式仅用于限制对紧随其后之基类的继承 派生类构成: 1、吸收的基类成员 默认条件下派生类包含了全部基类中除构造和析构函数之外的所有成员,但c++11标准中规定可以用using语句继承基类构造函数。 2、改造的基类成员 如果派生类声明了一个某基类成员同名的新成员,则派生的新成员就隐藏或覆盖了外层同名成员 3、添加新的成员 增加的新功能和数据。 继承方式 不同继承方式的影响: 1、派生类成员对基类成员的访问权限 2、通过派生类对象对基类成员的访问权限 公有继承(public) 私有继承(private) (若想调用基类的成员函数,可以在派生类中写一个成员函数