C++复习(第六章--多态与虚函数)

1.基类与派生类对象之间具有赋值兼容的关系,可以进行类型间的转换,派生类对象可以直接转换为基类对象,同样基类对象也可以直接转换为派生类对象 。(F)

原因:这句话是不正确的。在面向对象编程中,基类和派生类之间存在继承关系,但是基类对象和派生类对象之间不能直接进行类型转换。派生类对象可以隐式地转换为基类对象,这是因为派生类继承了基类的属性和方法,所以可以将派生类对象视为基类对象使用。这种转换被称为向上转型。例如,如果有一个基类为Animal,派生类为Cat,那么可以将Cat对象赋值给Animal类型的变量。然而,将基类对象直接转换为派生类对象是不允许的,因为基类对象可能不包含派生类特有的属性和方法。这样的转换可能导致数据丢失或出现运行时错误。如果确实需要将基类对象转换为派生类对象,通常需要使用类型转换操作符或者进行显式转换,前提是该基类对象实际上是一个派生类对象。总之,基类对象和派生类对象之间的转换是有限制的,只允许将派生类对象转换为基类对象,而不允许将基类对象直接转换为派生类对象。

2. 动态联编在编译时确定操作函数。

原因:这句话不正确。动态联编(dynamic binding)是指在运行时确定调用的函数或方法,而不是在编译时确定。在编程语言中,动态联编通常用于支持多态性(polymorphism)的实现。当一个函数或方法被声明为虚函数(在C++中)或者抽象方法(在Java中)时,它可以在派生类中被重写(override)。在运行时,根据对象的实际类型,通过动态联编机制来确定调用的是哪个重写的函数或方法。动态联编的机制允许程序在运行时根据对象的实际类型来调用相应的函数或方法,而不仅仅根据变量或引用的静态类型。这实现了多态性的特性,使得程序能够以更加灵活和可扩展的方式处理对象的行为。因此,动态联编是在运行时确定调用的函数或方法,而不是在编译时确定。编译时确定函数调用的机制被称为静态联编(static binding)。

3.实现动态联编必须通过对象名来调用虚函数。

原因:动态联编的机制是通过指针或引用来实现的,不是通过对象名。

示例代码: 通过将 animalPtr 指向不同的对象,可以动态地调用适当的 speak() 函数,实现了动态联编的效果。注意到,并没有使用对象名来调用虚函数,而是使用了基类指针 animalPtr。因此,通过指针或引用来调用虚函数是实现动态联编的常见方式,而不是必须使用对象名

4.关于虚函数的描述中,(D)是正确的。

A.虚函数是一个静态成员函数

B.虚函数是一个非成员函数

C.虚函数既可以在函数说明时定义,也可以在函数实现时定义

D.派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型

原因:不完全正确。在C++中,虚函数可以在函数声明时进行定义,但不可以在函数实现时进行定义。在函数声明时,可以在类中使用关键字 virtual 来声明虚函数,并提供函数的签名和返回类型。这告诉编译器该函数是一个虚函数,可以在派生类中被重写。这样的函数声明可以出现在类的定义中的任何位置。然而,在函数的实现部分,不应再使用 virtual 关键字来定义虚函数。实现函数时,应省略 virtual 关键字,并提供函数体的具体实现。

示例:

class Base {
public:
    virtual void virtualFunctionDeclaration(); // 虚函数在函数声明时定义
};

因此,虚函数可以在函数声明时进行定义,但在函数实现时不再使用 virtual 关键字进行定义。这是因为虚函数的定义和实现是分开的,允许在派生类中重写该函数以提供不同的实现。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值