关于基类和派生类之间的关系

作为面向对象的程序设计来说,继承是非常重要的一个特点,面向对象程序设计(Object-Oriented Programming, OOP)的核心思想是数据抽象、继承和动态绑定。其中使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。下面什么主要介绍的是继承中基类和派生类之间的关系。

在基类中有两种类型的成员是我们需要注意的,一种是基类希望派生类继承的;一种是基类希望派生类覆盖的。如:基类Quote和其派生类Bulk_quote.

class Quote
{
     public:
              std::string isbn() const;
              virtual double net_price(std::size_t n) const;
}

  这里成员函数isbn()是基类希望派生类继承的,派生类中不需要重新定义,而net_price是希望派生类覆盖的,派生类中有不一样的实现方式。这里基类Quote将希望派生覆盖的成员函数定义成虚函数,即在前面加上:virtual关键字。

那么,那些成员函数需要定义成虚函数了,即基类和派生类中都有各自的实现方式的时候,就需要在基类中将该成员函数定义成虚函数,希望派生类将其覆盖。动态绑定即是在我们使用基类的引用(或者指针)调用一个虚函数时发生的。这样程序就可以根据参数的不同来判断是调用基类的成员函数,还是调用派生类的成员函数。当然派生类也不是一定要重新定义基类中的虚函数,如果派生类没有覆盖基类中的虚函数,那么该虚函数就和其他普通函数一样,派生类就直接继承它在基类中的版本。

派生类和基类之间的类型转换

     上面例子中基类Quote里面有成员:bookNo和price,派生类Bulk_quote中有:min_qty和discount.当派生类继承基类的时候,派生类中就有两部分(四个)成员:一部分是继承Quote的bookNo、price,一部分是自己定义的min_qty、discount。因为在派生类对象中含有与其基类对应的组成部分,所有我们能把派生类的对象当成基类对象来使用,而且我们也能将基类的指针或者引用绑定到派生类对象中的基类部分上。如下:

Quote item;        //基类对象
Bulk_quote bulk;   //派生类对象
Quote *p = &item;  //p指向Quote对象
p = &bulk;           //p指向bulk的Quote部分
Quote &r = bulk; //r绑定到bulk的Quote部分

 注:在派生类对象中含有与其基类对应的组成部分,这一事实是继承的关键所在。 

时间: 2024-11-08 17:23:28

关于基类和派生类之间的关系的相关文章

C++:基类与派生类对象之间的赋值兼容关系

4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量.这种不同类型之间的自动转换,称为赋值兼容.在基类和派生类对象之间也存在有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替.因为,通过公有继承,除了构造函数和析构函数外,派生类保留了基类其他的所有的成员.那么,派生类就具有基类的全部功能,凡

c++基类与派生类之间的转换

1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class Box 5 { 6 public: 7 void setWidth(double width){ 8 this->width=width; 9 } 10 void setHieght(double height){ 11 this->height=height; 12 } 13 void getWidth(){ 14 cout

C++基类和派生类之间的转换

本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A(int m1, int n1):m(m1), n(n1){} 8 void display(); 9 private: 10 int m; 11 int n; 12 }; 13 14 void A::display() 15 { 16 cout <&

基类和派生类之间的同名函数处理方式

[基类和派生类之间的同名函数处理方式] class A { public: void fn() {} void fn(int a) {} }; class B : public A { public: void fn() {} }; int main() { B b; b.fn(3); // 编译失败,编译器会报怨,B中,并不存在fn(int)的函数). return 0; } 这里涉及到一个C++中的重要的知识点.即:同名函数的重载动作,只发生在自由函数(即非成员),及同一个class/str

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

基类与派生类的关系

任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的. 基类与派生类之间的关系可以有如下几种描述: 1. 派生类是基类的具体化 类的层次通常反映了客观世界中某种真实的模型.在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化.基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型. 2. 派生类是基类定义的延续 先定义一个抽象基类,该基类中有些操作并未实现.然后定义非抽象的派生类,实现抽象基类中定义的操作.例如,虚

C++学习21 基类和派生类的赋值

在C/C++中,经常会发生数据类型转换,例如整型数据可以赋值给浮点型变量,在赋值之前,先把整型数据转换为浮点型:反过来,浮点型数据也可以赋值给整型变量. 数据类型转换的前提是,编译器知道如何对数据进行取舍.例如: int a = 10.9; printf("%d\n", a); 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入).再如: float b = 10; printf("%f\n", b); 输出结果为 10.000000,编译器会自动添加小数部

C++ Primer 学习笔记_65_面向对象编程 -概述、定义基类跟派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)