由抽象基类继承得到的派生类肯定是具体类吗?

不一定是。参见介绍2017标准的《C++程序设计精要教程》,当所有基类以及基类的基类等等定义的纯虚函数,在派生类及其定义纯虚函数的基类之下的类中定义了相应(纯)虚函数的函数体,并且派生类没有自定义新的纯虚函数,则该派生类是具体类。

最简单的例子如下,派生类B不是具体类:

struct A{                   //定义抽象基类

    virtual void f()=0;

}A*p;

class B: public A{      //对于这种继承,A是父类,B是子类

    void f(){ }               //定义了基类的纯虚函数

    virtual void g()=0;  //类B定义了新的纯虚函数

};

viod main( ){

    p->f();                    //A::f()是可被main访问的,p-f()是正确的;

}

函数B::f()的访问权限private可以和A::f()的访问权限public不同,这种情况是允许的。编译程序进行的是静态的运行时的检查,此时p->f()并没有违背A::f()可访问性;若运行时p->f()最终调用B::f(),这已经无关编译程序了,编译程序并不负责运行时调用的函数的可访问性。

注意在C++中,常用基类和派生类描述类间的关系。当基类满足三个条件中的一个时,基类才可以被称为父类,而相应派生类才可以被称为子类。其它语言如java大多直接用父类或子类描述,因为java的定义天然满足父子类关系。

由上可知,基类被当作父类是有条件的。既然如此,当派生类有多个基类时,可能只有一部分基类可被称为父类,而相应的派生类被称为子类。多继承派生类能否成为具体类就更复杂了,需要声明的所有纯虚函数在其基类后都定义了函数体,并且当前多继承派生类没有说明新的纯虚函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,让我们解析并回答问题: 引用: - 基未明确给出,因为程序没有提供完整的上下文,但通常在面向对象编程中,如果提到"",可能指的是一个具有成员的抽象概念。 - 派生类同样未明确,但如果有`obj`,它可能是基的一个实例。 - 继承方式通常通过关键字`class`和冒号`:`表示,但这里没有提供具体继承信息。 引用: - 基未明确,因为`obj`和`objsetvalue()`表明可能有一个名为`obj`的对象,但不是标准的基/派生类定义。 - 表格内容缺失,无法提供完整信息。 引用]: - 由于只有返回值`return 0;`,无法确定基派生类。 - 同样,表格内容缺失,访问权限无法分析。 引用: - 基是`Base`,派生类是`Derive`,因为`obj1`和`obj2`属于不同的并且有各自的构造函数。 - 继承方式是默认的(无修饰词),意味着基的公有成员会被继承。 引用: - 问题关于`print()`函数的继承关系和权限,但没有具体代码。 - `Derive`的`print()`能否直接输入a、b的值取决于这些变量是否在派生类中声明或继承自基。 - `fun()`功能未明确,也无法判断在`main()`中调用`move()`的可行性。 根据以上信息,回答问题: 1. 本程序中的基派生类是什么?请补充完整表格内容。 2. 如何确定基派生类继承方式?是否有明确的继承关键字或语法? 3. 如果基中存在私有成员,派生类能否直接访问?为什么?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值