详解C++ 多态公有继承

推荐学习: 《c++教程》

——方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态——具有多种形态,即同一个方法的行为随上下文而异。

  virtual实现了对象调用正确的方法或方法序列。

  实现多态的两种机制:

在派生类中重新定义基类的方法(不会改变基类的方法)。使用虚方法。

  声明函数时若使用关键字virtual,则这些方法被称为虚方法。

方法在基类中被声明为虚的后,它在派生类中将自动成为虚方法。然而,在派生类声明中使用关键字virtual来指出哪些函数是虚函数也是一个好办法。

class Brass{
private: ...
public:
  ...
  virtual void ViewAcct() const;
  virtual ~Brass(){}}
 BrassPlus :

   基类声明了一个虚构函数,是为了确保释放派生对象时,按正确的顺序调用析构函数(后面见虚函数作用)。

立即学习“C++免费学习笔记(深入)”;

Brass dom("Dominic Banker", 11224, 4183.45);BrassPlus dot("Dorothy Banker", 12118, 2592.00);dom.ViewAcct();    // use Brass::ViewAcct()dot.ViewAcct();    // use BrassPlus::ViewAcct()

  两个ViewAcct()原型表明将有2个独立的方法定义。基类版本的限定名为Brass::ViewAcct(),派生类版本的限定名为BrassPlus::ViewAcct()。

  通过引用或指针而不是对象调用方法:

  如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法:

// behavior with non-virtual ViewAcct()// method chosen according to reference typeBrass &b1_ref = dom;Bross &b2_ref = dot;b1_ref.ViewAcct();    // use Brass::ViewAcct()b2_ref.ViewAcct();    // use Brass::ViewAcct()

  如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。为基类声明一个虚析构函数也是一种惯例,使用虚析构函数可以确保正确的析构函数序列被调用(即从派生类对象到基类对象一次调用它们的析构函数)。

  调用基类方法:在派生类方法中,标准技术是使用作用域解析运算符来调用基类方法:

  Brass::ViewAcct(); // display base portion

以上就是详解C++ 多态公有继承的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1434196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 09:46:19
下一篇 2025年12月17日 09:36:26

相关推荐

  • 史上最佳的C#编程书籍推荐

    C#和.NET非常受全球开发人员的追捧和热爱。书籍是人类进步的阶梯。想要学习C# ?这里有10本学习C#编程的最好书籍在等着你哦。 1.《C# 5.0 in a Nutshell》:权威的参考书 学习C#的最佳书籍之一。如果你想要获取最新的信息以增长有关C#语言编程的知识,这是最好的选择之一。该书深…

    2025年12月17日 好文分享
    000
  • 手把手教你C#中指针的使用方法

    手把手教你C#中指针的使用方法 C#是一门解释型语言,其中对指针进行了封装,因此用户无法直接调用对象的指针。但是当使用C#调用C/C++的DLL时,常常会函数参数或者返回值为指针的情况。这种情况下就需要对指针进行操作。 在C#中使用指针,需要首先回答以下几个问题: 1. C#提供了哪几种指针类型 C…

    2025年12月17日
    000
  • 对比分析C#与Java的区别

    相同点: 都是面向对象编程的语言,都能够实现面向对象的(封装,继承,多态)思想 不同点: 1.c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。 立即学习“Java免费学习笔记(深入)”; 2.c#和Java都是从mai…

    2025年12月17日
    000
  • c++标识符命名规则

    c++kquote>c++标识符命名规则:1、标识符由字母、数字和下划线组成;2、不能把c++关键字作为标识符;3、标识符长度限制32个字符;4、标识符对大小写敏感;5、首字母只能是字母或下划线,不能是数字。 c++标识符命名规则: (推荐学习:C语言教程) 标识符(identifier)由字…

    2025年12月17日
    000
  • 详解C++虚成员函数和动态联编

    推荐学习: 《c++教程》 ——编译器对非虚方法使用静态联编(编译时匹配),对虚方法使用动态联编(运行时匹配)。 未使用虚方法时,指针类型在编译时已知,因此编译器在编译时,可以将成员方法关联到相应的类,这被称为静态联编;使用虚方法时,通常只有在运行程序时才能确定对象类型,所以编译器生成的代码在程序执…

    好文分享 2025年12月17日
    000
  • C++语言标识符的命名规则是什么?

    C++语言标识符的命名规则是:1、标识符的命名要以字母大小写或者下划线【_】开头;2、尽量将标识符命名为有意义的单词等,增加程序的可读性;3、尽量在一个变量的命名中将不同单词的首字母大写。 C++语言标识符的命名规则是: 标识符是一个字符序列,用来标识变量、函数、数据类型等。C++语言的标识符由数字…

    2025年12月17日
    000
  • 在C语言里二维数组在内存中的存放顺序是什么?

    在c语言里二维数组在内存中的存放顺序是按行存放的,二维数组A[m][n],这是一个m行,n列的二维数组,设a[p][q]为A的第一个元素,即二维数组的行下标从p到【m+p】,列下标从q到【n+q】即可。 在c语言里二维数组元素在内存中是按行存放的。 二维数组A[m][n],这是一个m行,n列的二维数…

    2025年12月17日
    000
  • C++中字符串比较函数strcmp怎么用?

    C++中字符串比较函数strcmp的用法是什么? 函数原型: int strcmp(const char *s1, const char *s2);1 头文件: 立即学习“C++免费学习笔记(深入)”; #include 1 功能: 用来比较两个字符串 参数: s1、s2为两个进行比较的字符串 返回…

    2025年12月17日
    000
  • 深入学习C++必读书籍(推荐)

      深入学习C++必读书籍(推荐) 以前有不少朋友问关于学习各种技术的推荐书籍的问题,这里把我觉得比较好的一些书籍列一下,希望能起到抛砖引玉的作用就好了:) C++ Primer,Thinking in C++,The Standard C++ Library,The C++ Programming…

    2025年12月17日
    000
  • C++与C语言的区别与联系

    C++与C语言的区别与联系 1、C语言是面向过程的,而C++是面向对象的; 2、在C语言中结构体只有成员变量,而没成员方法,而在C++中结构体中,可以有成员变量和成员函数; 3、C++是从C语言中发展而来的。 立即学习“C语言免费学习笔记(深入)”; 视频教程推荐:《Linux C语言编程基本原理与…

    2025年12月17日
    000
  • c++中类的定义是什么

    c++++中类的定义是什么? 就是定义一个类 类型的数据,类类型是C++语言的一个显著特点,C语言里是没有的。 举个例子,类就相当于现实生活中我们说的类型,比如定义《人》这个类,那么人包括男人,女人;或者看成包括老人,成人,小孩;或者看成包括好人,坏人。等等。。。 在C++语言中也一样,定义一个类C…

    2025年12月17日
    000
  • c++中判断重载方法的依据是什么

    c++++中判断重载方法的依据是什么? 1、函数形参的个数; (推荐教程:c语言教程) 2、函数形参的类型; 3、形参的顺序; 立即学习“C++免费学习笔记(深入)”; 4、常函数 const 也可以作为函数重载判断依据。 原因:重载[]运算符时,有没有const的区别是:有const只读,没有co…

    2025年12月17日
    000
  • 表达式求值的c语言代码是什么?

    表达式求值的c语言代码是什么? 表达式求值的c语言代码是 一.不包括括号运算 #include #include #include #include #include #define STACK_INIT_SIZE 100 using namespace std; typedef struct { …

    2025年12月17日
    000
  • c++如何比较两个字符串?

    推荐教程:《C视频教程》 c++++如何比较两个字符串? c++两个字符串比较的方法: 1、首先,定义一个整型变量j,保存判断的结果。 立即学习“C++免费学习笔记(深入)”; 2、接着,定义两个字符串变量,保存判断的字符串。 3、输入两个字符串,保存在变量s1和s2中。 4、比较字符串s1和s2的…

    2025年12月17日 好文分享
    000
  • return在c语言中是什么意思?

    return在c语言中是什么意思? return表示把程序流程从被调函数转向主调函数,并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定,如“return 123456”,会将123456返回到主函数中。 return 的意义 在函数中,如果碰到ret…

    2025年12月17日
    000
  • C语言是高级编程语言吗?

    C语言是高级编程语言吗? C语言是高级编程语言,高级语言主要是相对于汇编语言而言,基本脱离了机器的硬件系统,用于更易理解的方式编写程序,C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。 C语言主要特点 C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程…

    2025年12月17日
    000
  • c++中new的用法详解

    c++++中new的用法详解 C++中new运算符用于动态分配和撤销内存的运算符。 1、开辟单变量地址空间 new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new …

    2025年12月17日
    000
  • 新手程序员应该知道的C语言和C++的区别

    c++sdnimg.cn/release/phoenix/template/css/ck_htmledit_views-211130ba7a.css”/> 新手程序员应该知道的C语言和C++的区别 在刚刚学习编程的时候是不是有很多人以为C语言和C++是一样的呢?今天我就来详细的介绍…

    2025年12月17日
    000
  • c++定义数组的方法

    在 c++++ 中如果要声明一个数组,需要指定元素的类型和元素的数量,如下所示: type arrayName [ arraySize ]; arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据类型。 (推荐教程:C语言教程) 例如,要声明一个类型为 double…

    2025年12月17日
    000
  • c++运算符重载的方法有哪些

    c++++运算符重载的方法有哪些? 有两种方法可以使运算符重载:1、使重载运算符成为该类的成员函数。这允许运算符函数访问类的私有成员。它也 允许函数使用隐式的this指针形参来访问调用对象。 2、使重载的成员函数成为独立分开的函数。当以这种方式重载时,运算符函数必须 声明为类的友元才能访问类的私有成…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信