派生类

浅谈C++继承

人盡茶涼 提交于 2019-11-27 18:48:03
C++中的继承 1.继承概念及定义: 概念:是面向对象程序设计使代码可以复用的最重要的手段-----继承是类设计层次的复用 定义: 父类->基类;子类->派生类 总结: 基类的private成员在派生类中无论以什么方式继承都是不可见的。 这里的不可见是指基类的私有成员还是被继承到了派生类对象中, 但是语法上限制派生类对象不管在类里面还是类外面都不能访问 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类 中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。 基类的私有成员在子类都是不可见,基类的其他成员在子类的访问方式==Min(成员在基类的访问 限定符,继承方式),public > protected > private 使用关键字class时默认的方式时private,使用struct默认的继承方式时是public,不过最好显示的 写出继承方式。 在实际运用中一般使用都是public继承,几乎很少使用protected/private继承,这种继承下来的成 员只能在派生类的类里面使用,实际中扩展维护不强 2.基类和派生类对象赋值转换 派生类对象可以赋值给基类对象/基类的指针/基类的引用。 基类对象不能赋值给派生类对象 基类的指针可以通过强制类型转换赋值给派生类的指针,但是必须是基类的指针是指向派生类对象时

C++_练习—继承_多继承

孤街浪徒 提交于 2019-11-27 15:31:40
多继承 多继承:派生类继承多个基类(继承多父类特性) 语法:class <派生类名>: <继承方式1><基类名1> , <继承方式2><基类名2> , ...{ <派生类类体>; } 1 #include <iostream> 2 3 using namespace std; 4 5 class info1 { 6 public: 7 void setter1(int a) { 8 num1 = a; 9 } 10 11 protected: 12 int num1; 13 14 private: 15 int age1; 16 }; 17 18 class info2 { 19 public: 20 void setter2(int a) { 21 num2 = a; 22 } 23 24 protected: 25 int num2; 26 27 private: 28 int age2; 29 30 }; 31 32 class info : public info1, public info2 { 33 public: 34 void fun(void) { 35 int a; 36 a = num1 + num2; 37 cout << a << endl; 38 } 39 40 protected: 41 int num3; 42 43 private: 44 int

C++_练习—继承_公有继承

我是研究僧i 提交于 2019-11-27 15:01:33
公有继承 公有继承 public: 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中  不变,而基类的私有成员不可访问。 即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无  论派生类的成员还是派生类的对象都无法访问基类的私有成员。 1 #include <iostream> 2 3 using namespace std; 4 5 class info { 6 public: 7 int getter(void) { 8 return age; 9 } 10 11 void setter(int a) { 12 age = a; 13 } 14 void pri(void) { 15 cout << age << endl; 16 } 17 18 protected: 19 int prot; 20 21 22 private: // 派生类不可访问 23 int age; 24 }; 25 26 class info_j :public info { 27 public: 28 void info_pri(void) { 29 cout << num << endl; 30 } 31 32 void set_pri_prot(int a) { 33 info::prot = a; 34

c++ 继承

泄露秘密 提交于 2019-11-27 13:47:38
继承 继承 允许我们依据另一个类来定义一个类 这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。 当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为 基类 ,新建的类称为 派生类 。 一、基类 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数 定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下: class derived-class: access-specifier base-class 访问修饰符 access-specifier 是 public、protected 或 private 其中的一个base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。 举例: #include <iostream> using namespace std; // 基类 class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类

虚继承和虚基类

南楼画角 提交于 2019-11-27 10:37:39
多继承(Multiple Inheri tan ce)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 图1:菱形继承 类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A-->B-->D 这条路径,另一份来自 A-->C-->D 这条路径。 在一个派生类中保留间接基类的多份同名成员,虽然可以在不同的成员变量中分别存放不同的数据,但大多数情况下这是多余的:因为保留多份成员变量不仅占用较多的存储空间,还容易产生命名冲突。假如类 A 有一个成员变量 a,那么在类 D 中直接访问 a 就会产生歧义,编译器不知道它究竟来自 A -->B-->D 这条路径,还是来自 A-->C-->D 这条路径。下面是菱形继承的具体实现: 复制纯文本复制 //间接基类Aclass A{protected: int m_a;}; //直接基类Bclass B: public A{protected: int m_b;}; //直接基类Cclass

面向对象之类的成员

≯℡__Kan透↙ 提交于 2019-11-27 08:35:20
面向对象之类的成员 细分类的组成成员 类大致分为两块区域: 第一部分:静态字段 第二部分:动态方法 class Animal: type_name = "动物类" # 静态变量(静态字段) __feature = "活的" # 私有静态变量(静态字段) def __init__(self,name,size): # 特殊方法 self.name = name # 对象属性 self.__size = size # 私有对象属性(私有普通字段) def func1(self): # 普通方法 pass def __func(self): # 私有方法 print(666) @classmethod # 类方法 def class_func(cls): print("类方法") @staticmethod # 静态方法 def static_func(): print("静态方法") @property # 属性 def prop(self): pass 类的私有成员 对于每一个类的成员而言都有两种形式: ​ 公有成员,在任何地方都能访问 ​ 私有成员,只有在类的内部才能访问 私有成员和公有成员的访问限制不同: 静态字段(静态属性) ​ 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问 ​ 私有静态字段:仅类内部可以访问 class C: name = "公有静态字段"

构造函数与派生类构造函数

你说的曾经没有我的故事 提交于 2019-11-27 02:30:34
构造函数与派生类构造函数 相关链接: https://www.runoob.com/cplusplus/cpp-constructor-destructor.html 构造函数 首先我们需要知道,到底什么叫做 构造函数 ?它的作用是什么呢? 构造函数是类中一种特殊的函数,它不具备返回值,并且函数名称必须与类名一致,当类创建对象的时候自动调用。 需要强调的是,当你创建一个类,系统会自动为你生成隐式的无参构造函数和析构函数。 构造函数一般用作初始化数据成员 构造函数与其他函数的特性具有共同之处,显著的相同点是它可以 重载 ,接下来,用代码来简单演示一下。 1 #include <iostream> 2 using namespace std; 3 class Time{ 4 private: 5 int h; 6 int m; 7 int s; 8 public: 9 Time(){ 10 h = 0; 11 m = 0; 12 s = 0; 13 } 14 Time(int h,int m,int s){ 15 this->h = h; 16 this->m = m; 17 this->s = s; 18 } 19 /* 效果同上,初始化方式的多样化 20 Time(int h,int m,int s):h(h),m(m),s(s){} 21 */ 22 void display()

第 15 章

不打扰是莪最后的温柔 提交于 2019-11-26 23:40:15
15.1 【出题思路】 熟悉理解虚函数、虚成员的定义。 【解答】 在类中被声明为 virtual 的成员,基类希望这种成员在派生类中重定义。除了构造函数外,任意非 static 成员都可以为虚成员。 15.2 【出题思路】 区分 protected 和 private 的访问权限控制的不同之处。 【解答】 protected 为受保护的访问说明符。protected 成员可以被该类的成员、友元和派生类成员(非友元)访问,而不可以被该类类型的普通用户访问。而 private 成员只能被基类的成员和友元访问,派生类不能直接访问。 15.3 【出题思路】 书中示例,作为基类用于后续练习题。 【解答】 Quote.h #ifndef TEST_QUOTE_H #define TEST_QUOTE_H #include <string> #include <iostream> class Quote { public: Quote() = default; Quote(const std::string &book, double sales_price) : bookNo(book), price(sales_price) { } std::string isbn() const { return bookNo; } // 返回给定数量的书籍的销售总额 //

【十】类——2

夙愿已清 提交于 2019-11-26 19:11:55
一.类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。 通过继承创建的新类称为 子类 或 派生类 ,被继承的类称为 基类 、 父类 或 超类 。 继承语法 class 派生类名(基类名) ... 在python中继承中的一些特点: 如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数 Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。 如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。 语法: 派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示: class SubClassName (ParentClass1[, ParentClass2, ...]): ... 实例: class Parent: # 定义父类 parentAttr = 100 def __init__(self): print "调用父类构造函数" def parentMethod(self): print '调用父类方法' def setAttr(self, attr

【转】重载(overload)、覆盖(override)、隐藏(hide) 辨析

不问归期 提交于 2019-11-26 17:42:55
对这些概念老是记不清楚,转了一篇比较通俗的文章帮助记忆,高手请绕道^_^~ 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一:     #include "stdafx.h" #include class CB { public: void f(int) { cout << "CB::f(int)" << endl; } };   class CD : public CB { public: void f(int,int) { cout << "CD::f(int,int)" << endl; } void test() { f(1); } };  int main(int argc, char* argv[]) { return 0; } 编译了一下 error C2660: 'f' : function does not take 1 parameters 结论:在类CD这个域中,没有f(int)这样的函数,基类中的void f(int)被隐藏 。 如果把派生CD中成员函数void f(int,int