首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++设计类的注意事项

下面这些情况会用到复制构造函数: 将新的对象初始化为一个同类对象。 按值将对象传递给函数。 函数按值返回对象。 编译器生成临时对象。...同理,如果要做到不同类之间的赋值(也包括基类赋值给派生类),要么做强制类型转换再赋值,要么定义一个特定参数的赋值操作函数。 赋值操作符也是不能被继承的,毕竟其特征标(参数列表)随类而异。...在定义派生类的赋值操作符重载函数时,要显式地在函数块中通过::来调用基类的赋值操作符,来操作基类的成员,毕竟派生类很多时候无法直接访问到基类成员,只能通过调用基类的公开方法来访问,而且也不能通过初始化列表的方式来调用...另外,也由于C++支持用基类的引用指向派生类时,对于虚函数会调用其真实类型的函数,这保证了灵活的使用。只是要注意如果在函数中不修改对象,最好用const修饰对象参数,避免修改。...私有成员与保护成员 用private修饰的为私有成员,只有类对象自己可以访问,派生类也不可以。用protected修饰的为保护成员,类对象自己可以访问,派生类也可以访问,外部类不能访问。

39920

C++:52---多重继承

与单一继承原理一致,对象、引用、指针的静态类型决定了我们能够使用哪些成员 例如: 我们使用一个ZooAnimal指针指向于一个派生类,那么只能通过这个指针访问属于ZooAnimal的数据成员/方法,而不能调用属于基类的数据成员.../方法 我们使用一个Bear指针指向于Panda对象,则只能通过这个指针访问属于Bear以及ZooAnimal的成员,不能访问Panda的数据成员/方法和Endangered的数据成员/方法 演示案例:...,在派生类中不存在,那么就继续向基类中进行查找,如果查找到了就进行使用 多重继承下派生类的作用域嵌套在所有的基类或间接基类的作用域中 二义性与二义性的解决 当同一个数据成员/函数的名称在不同的基类中出现时...,通过作用域限定符来访问调用哪一版本的数据成员/方法 class A { public: int num; }; class B { public: int num; }; class C :public...::num, B::num); } }; 注意事项: 有时即使派生类继承的两个函数形参列表不同也可能会发生错误 另外,同名的数据成员/函数,在不同的基类中访问权限不同也可能会发生错误(例如一个数据成员在基类

96230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《C++Primer》第十五章 面向对象程序设计

    首先初始化基类的部分,然后按照声明顺序依次初始化派生类的成员。 2.2 派生类使用基类的成员 派生类可以直接访问基类的公有成员和受保护成员。...受保护成员 一个protected关键字声明它希望与派生类分享但是不想被其他公共访问使用的成员: 和私有成员类似,受保护的成员对于类的用户来说不可访问 和公有成员类似,受保护的成员对派生类的成员和友元来说是可访问的...派生类的成员或者友元只能通过派生类对象来访问基类的受保护成员,派生类对于一个基类对象中的受保护成员没有任何访问特权 理解最后一条规则可以参考如下例子: class Base { protected:...;派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的 如果D继承B的方式是公有的或者受保护的,则D的派生类的成员和友元可以使用D向B的类型转换,反之如果D继承B的方式是私有的,则不能使用...当我们为派生类定义拷贝或者移动构造函数时,我们通常使用对应的基类构造函数初始化对象的基类部分: // 初始值Base(d)将一个D对象传递给基类构造函数,Base(d)会去匹配Base的拷贝构造函数,将

    1.2K20

    【c++】继承学习(一):继承机制与基类派生类转换

    它是继承关系中处于较高层次的类,其特性(属性和方法)可以传递到派生的类中。其他从父类继承的类会自动获得父类定义的所有公共和受保护的成员。 子类/ 派生类: 子类是从一个或多个父类继承特性的类。...引用实际上并不拥有它所引用的对象,而只是提供另一个名称来访问现有对象。因此,当我们通过基类引用访问派生类对象时,并没有创建新的对象,也没有丢失派生类的任何部分。...使用引用和指针时不会发生切片 对象切片的问题仅在派生类对象被赋值给另一个基类类型的对象时才会发生,比如当派生类对象被传值给一个基类对象的函数参数,或者通过赋值构造一个新的基类对象。...,以及如何在派生类中访问基类的被隐藏成员的概念。...如果在派生类中尝试访问一个被隐藏的基类成员,需要显式地使用类名限定符来指定基类的成员。在 Print 方法中使用 Person::_num 来访问基类 Person 中的 _num 成员。

    37910

    第十五章:C++访问控制权限、继承和多态详解

    概述 C++中的访问控制权限是面向对象编程的重要概念之一。通过访问控制权限,我们可以限制类成员的访问范围,以保护数据的安全性和封装性。...它们定义了类成员对外暴露的程度,以下是它们的基本规则: public:公共权限,允许在类内部和外部使用。 protected:受保护的权限,允许在类内部和派生类中使用。...sleep(); // 可以访问基类的受保护成员 //run(); // 无法访问基类的私有成员 } }; int main() { Dog...由于Cat类中的makeSound()函数被定义为private,因此无法通过基类指针来访问它,而只能通过派生类对象直接访问。 4....总结 本文详细介绍了C++中的访问控制权限,以及在继承和多态中的应用。通过设置不同的访问权限,可以限制类成员的访问范围,保护数据的安全性和封装性。

    9010

    代码重用

    保护继承在列出基类的时候使用关键子protected;保护继承使得基类的公有成员和保护成员都将称为派生类的保护成员,其与私有继承一样,基类的接口在派生类中都是可用的,但是在继承层次结构之外是不可用的。...两者的最大区别在于派生类再派生出另外一个类的时候,使用私有继承第三代类将不能使用基类的接口,因为基类的公有方法在第二代类中变成了私有方法;但是在使用保护继承,第三代类可以使用基类的接口,因为在第二代类中基类的公有方法变成受保护的...公有继承、私有继承和保护继承的特点如下: 特征 公有继承 保护继承 私有继承 基类的公有成员变成 派生类的公有成员 派生类的保护成员 派生类的私有成员 基类的保护成员变成 派生类的保护成员 派生类的保护成员...派生类的私有成员 基类的私有成员变成 只能通过基类的接口访问 只能通过基类接口访问 只能通过基类接口访问 能否隐式向上转换 是 是(但只能在派生类中) 否 (注:这里的隐式向上转换只意味着无需进行显式类型转换...,Abc类通过BaseA或BaseB的构造函数将参数信息间接传递给Base时将不起作用,c++在基类是虚的时候,禁止将参数信息通过中间类传递给基类。

    62540

    【干货】C++基础知识:继承与派生详解

    继承和派生的概念 01 派生 通过特殊化已有的类来建立新类的过程,叫做“类的派生”, 原有的类叫做”基类”,新建立的类叫做“派生类”。 02 继承 类的继承是指派生类继承基类的数据成员和成员函数。..., 在Rect类中也是受保护的, 所以可以访问 // 而通过公有继承的基类私有的成员, 在派生类中是不可被访问的 void showRect() { cout 基类的公有成员在派生类中仍然是公有的 基类的保护成员在派生类中仍然是受保护的 基类的不可访问的成员在派生类中仍然是不可访问的 基类的私有成员在派生类中变成了不可访问的 总结:在公有派生的情况下,通过派生类自己的成员函数可以访问继承过来的公有和保护成员...一个类用另一个类的对象作为自己的数据成员或者成员函数的参数 has-a。...(3)私有派生 通过私有派生,基类的私有和不可访问成员在派生类中是不可访问的,而公有和保护成员这里就成了派生类的私有成员。

    1.2K20

    C++继承

    当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...,但是可以通过调用基类的公有和保护成员来访问。...保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,继承了多个父类的成员变量和函数。

    39620

    C++面试知识总结

    多态:通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。...  3.8 析构函数的特点 函数名称固定:~类名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动的调用 3.8 公有继承、私有继承、受保护的继承 公有继承时,派生类对象可以访问基类中的公有成员...,派生类的成员函数可以访问基类中的公有和受保护成员;公有继承时基类受保护的成员,可以通过派生类对象访问但不能修改。...私有继承时,基类的成员只能被直接派生类的成员访问,无法再往下继承。 受保护继承时,基类的成员也只被直接派生类的成员访问,无法再往下继承。...一个基类的引用可以指向它的派生类实例。 3.12 static成员变量和static成员函数 static数据成员独立于该类的任意对象而存在。

    1.8K41

    解锁C++继承的奥秘:从基础到精妙实践(上)

    通过系统的学习,你将对C++继承有更深入的理解,并能够在实际开发中灵活应用这些知识。...通过继承,子类不仅可以复用基类的已有功能,还可以扩展或修改其行为。这种机制大大提高了代码的复用性和扩展性。 1.1 继承的定义 继承使得一个类可以获取另一个类的特性。...具体来说,子类会继承基类的成员变量和成员函数,并且可以添加新的成员或修改已有的成员。子类通过继承关系,可以拥有基类的公共和受保护(protected)成员。...基类的protected成员在子类中保持为protected,只能在子类内部和其派生类中访问。 基类的private成员对子类不可见,但可以通过基类的public或protected函数间接访问。...2.1 向上转换(Upcasting) 向上转换是指把派生类对象的指针或引用赋值给基类的指针或引用。由于派生类继承了基类的所有公开和受保护成员,基类可以“容纳”派生类对象的一部分。

    17310

    【深入浅出C#】章节 4: 面向对象编程基础:封装、继承和多态

    封装的主要目的有以下几点: 数据隐藏:通过将数据声明为私有成员,只允许通过类的公共方法来访问和修改数据。这样可以防止直接访问和修改数据,从而保护数据的一致性和安全性。...protected: 受保护访问修饰符,表示成员对于定义它的类和该类的子类是可见和可访问的。受保护成员对于其他代码是不可见的。...受保护成员(protected): 这些成员对于定义它的类内部和该类的子类是可见和可访问的,对其他代码是不可见的。...派生类Dog通过冒号:指定基类为Animal,这意味着Dog类继承了Animal类的属性和方法。 通过继承,派生类可以获得基类的公共成员,如Name属性和Eat()方法。...可替换性和可测试性:多态性使得我们可以将对象视为其基类或接口的实例,这为代码的替换和测试提供了便利。

    62730

    C++ 多级继承与多重继承:代码组织与灵活性的平衡

    接口继承: 使用接口来定义公共行为,并让类实现这些接口。组合: 使用一个类作为另一个类的成员,而不是通过继承来获得其功能。总结多级继承是一种强大的 OOP 工具,可用于创建复杂的类层次结构。...在使用多级继承之前,请仔细权衡其优缺点,并考虑其他设计模式。C++ 多重继承多重继承允许一个类从多个基类继承属性和方法。这意味着派生类可以继承多个基类的功能和特性。...接口继承: 使用接口来定义公共行为,并让类实现这些接口。组合: 使用一个类作为另一个类的成员,而不是通过继承来获得其功能。...访问控制规则在多重继承中,访问控制规则遵循以下原则:公有继承: 派生类继承所有公有成员和受保护成员。私有继承: 派生类不能继承任何私有成员。...受保护继承: 派生类继承所有受保护成员,但这些成员在派生类中变为私有。总结多重继承是一种强大的 OOP 工具,可用于创建复杂的类层次结构。但是,它也存在一些缺点,例如复杂性和菱形继承问题。

    18010

    c++–继承

    当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。...当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问...,但是可以通过调用基类的公有和保护成员来访问。...保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。...私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。 多继承 多继承即一个子类可以有多个父类,它继承了多个父类的特性。

    35410

    C++:继承#1

    继承#1 如果一个类属于另一个类的范畴,也就是说另一个类包含这个类。为了方便,只需要定义已有类中没有的成员就可以建立一个新类,而继承正是为了方便该操作的进行。...派生类的构造 上面的内容说明了如何继承父类从而派生出新的类,但派生类中含有父类的成员,如何对其进行构造?构造函数应该怎么写呢?...派生类的成员函数可以访问基类的公共及保护数据成员,甚至可以直接初始化它们,但更好的习惯是,通过基类的接口去操作基类的数据成员,类与类之间尽量互不干扰,使用接口进行沟通,方便后续维护。...保护继承:将基类的保护和公有成员全部视为自己的保护成员。 私有继承:将基类的保护和公有成员全部视为自己的私有成员。...保护继承意味着外界不能访问基类中的任何成员,但可以通过派生类中的自身公有成员函数访问继承出的保护成员; 私有继承同样也意味着外界不能访问基类中的任何成员,但可以通过派生类中的自身公有成员函数访问继承出的私有成员

    41020

    后台开发:核心技术与应用实践 -- C++

    基类成员在派生类中的访问属性: 公用继承(public inheritance):基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有 私有继承(private inheritance...):基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有 受保护的继承(protected inheritance):基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有...受保护成员的意思是,不能被外界引用但可以被派生类的成员引用。 综上,可以视为基类访问权限与派生类继承方式的叠加最小访问权限。...同时,无论哪一种继承方式,在派生类中是不能访问基类的私有 成员的,私有成员只能被本类的成员函数所访问,毕竟派生类与基类不是同一个类 构造派生类的对象时,必须对基类数据成员、新增数据成员和成员对象的数据成员进行初始化...而 虚函数 的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

    1.3K10

    C++ 类的继承与派生

    公用继承 如果采用公用继承,基类中的访问属性在派生类中保持不变,即: 基类中的私有属性——派生类中私有属性 基类中的共用属性——派生类中共用属性 基类中的受保护属性——派生类中受保护属性 class...(); 私有继承 如果采用私有继承,基类中的访问属性在派生类中发生如下变化,即: 基类中的私有属性——派生类中不可访问 基类中的共用属性——派生类中私有属性 基类中的受保护属性——派生类中私有属性...但是有一点与私有成员不同:受保护成员可以被派生类的成员函数引用。...如果采用保护继承,基类中的访问属性在派生类中发生如下变化,即: 基类中的私有属性——派生类中不可访问 基类中的共用属性——派生类中受保护属性 基类中的受保护属性——派生类中受保护属性 class...,函数受保护就没有与外界的接口了,在这里仅仅作为例子) 在这个例子中,派生类Student1中的私有成员为: int age; 共有成员为: myshow1(); 受保护成员为:

    1.1K80

    《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

    友元函数 友元类 4.7 类的组合 4.8 共享数据的保护 五、继承与派生 5.1 继承与派生的概念 基类成员在派生类中的访问属性 派生类对基类成员的访问规则 5.2 派生类的构造函数和析构函数 5.3...,即类的私有成员(或保护成员)只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问。...因为友元函数不是类的成员,所以它不能直接访问对象的数据成员,也不能通过this指针访问对象的数据成员,它必须通过作为入口参数传递进来的对象名(或对象指针、对象引用)来访问该对象的数据成员。...如果派生类的基类也是一个派生类,每个派生类只需负责其直接基类数据成员的初始化,依次上溯。 ~ 5.3 调整基类成员在派生类中的访问属性的其他方法 派生类可以声明与基类成员同名的成员。...访问声明中只含不带类型和参数的函数名或变量名。 访问声明不能改变成员在基类中的访问属性。 对于基类的重载函数名,访问声明将对基类中所有同名函数其起作用。

    3.4K40

    C++期末复习总结(2)

    ,公有继承的时候,我们的父类里面的公有成员还是公有成员,受保护的成员还是受保护的成员,私有成员就不存在了; 第二种是受保护的继承,这个时候,原来的公有成员就变成了受保护的成员,原来的父类里面的受保护的成员还是受保护的...,原来的私有成员变量这个时候还是不存在的; 第三种就是私有的继承,这个时候,原来的父类里面的共有的成员变量和保护的成员变量就是私有的了,原来的父类里面的受保护的成员变量也是不存在的; (2)我们在这个继承的子类里面是没有办法访问这个所谓的父类里面的私有成员变量的...,例如我们可以把这个共有的改变成为受保护的,把这个受保护的改变权限为共有的,这个父类里面的私有的成员变量的权限是没有办法通过这个关键字改变的,因为这个父类里面的私有的成员变量在这个子类里面根本就不会存在...,我们就可以把这个父类里面的公有成员变量修改为受保护的,把这个受保护的成员变量修改权限为公有的,当然也可以把他们的权限设置为私有的; 4.继承的对象模型 (1)这个地方是帮助我们了解C++继承语法的底层逻辑...,在基类和派生类的构造函数里面,this指针是相同的地址,派生类和基类都有的成员变量的地址也是一样的; (5)在C++里面这个成员变量的访问权限只是语法上面的限制,我们可以使用memset函数清零数据,

    5400

    第 15 章 面向对象程序设计

    如果我们通过基类的引用或指针调用函数,即使实际运行的是派生类中的函数版本,其使用的也是基类中定义的默认实参。 有时候我们希望对虚函数的调用不要进行动态绑定,而是强迫其执行虚函数的某个特定版本。...---- 15.5 访问控制与继承 派生类的成员和友元只能访问派生类对象中的基类部分的受保护成员,对于普通的基类对象中的成员不具有特殊的访问权限,即在派生类中也不能通过基类对象来访问基类的 protected...假定 D继承自 B: 只有当 D公有地继承 B时,用户代码才能使用派生类向基类的类型转换;如果 D继承 B的方式是受保护的或私有的,则用户代码不能使用该转换。...如果 D继承 B的方式是公有或受保护的,则 D的派生类的成员和友元可使用 D向 B的类型转换;反之,如果 D继承 B的方式是私有的,则不能使用。 就像友元关系不能传递一样,友元关系同样也不能继承。...只对基类部分进行初始化,派生类自己的数据成员将会默认初始化。

    1K30
    领券