首页 > 试题广场 >

有如下程序段,请问程序输出为?

[单选题]
有如下程序段:
#include "stdio.h"

class A
{
public:
    int _a;
    A()
    {
        _a = 1;
    }
    void print()
    {
        printf("%d", _a);
    }
};
class B: public A
{
public:
    int _a;
    B()
    {
        _a = 2;
    }
};
int main()
{
    B b;
    b.print();
    printf("%d", b._a);
}
请问程序输出:
  • 22
  • 11
  • 21
  • 12
推荐
选D:12
 因为在继承的时候,允许子类存在与父类同名的成员变量,但是并不覆盖父类的成员变量,他们同时存在。 因为给孩子类中没有定义print函数,所以会按照就近原则去寻找父类中是否有print函数。恰好父类中有这个函数,于是调用父类的print函数b.print(),而这个函数会调用父类的a变量。
编辑于 2015-02-04 20:44:59 回复(9)
在继承中,虽然子类继承了父类的函数,但父类的函数只能操作父类那个块域的数据,这个题中print函数子类是通过继承父类才拥有该函数,但你要是想让这个函数操作数据它只能操作父类中拥有的数据。
发表于 2015-10-09 20:55:49 回复(3)
子类公有(public)继承父类,所以子类可以通过对象访问父类的公有成员函数,由于调用的是父类的公有成员函数(该函数中的this指针存放的是父类对象的地址),所以打印的是父类A的_a
发表于 2015-09-01 12:00:00 回复(0)
输出1,2
如果子类和父类具有相同名字的成员变量,则他们是相互独立的。子类中没有print函数,因此会去它的父类中找,找到后,会根据就近原则输出父类的成员变量,输出1。直接调用b._a则输出2
发表于 2017-01-28 21:25:07 回复(0)
父类的方法优先调用父类的变量。。。
发表于 2016-11-14 20:50:02 回复(0)
1.子类和父类存在同名成员变量(对于函数还需要同满足参数)时,子类会屏蔽父类的成员变量。 2.虽然子类继承了父类,但父类的函数只能操作父类的数据域,所以b.print函数打出来的是1。
发表于 2019-12-29 19:12:58 回复(0)
补充:如果class B里没有覆盖class A的变量_a的话,输出22.
这道题关键就是因为B覆盖了A的成员变量,所以B的初始化,初始的是自己定义的变量_a。
发表于 2017-06-26 20:20:25 回复(0)
可以通过继承中的作用域关系来理解:继承关系中,派生类的作用域在基类的作用域之内,即嵌套作用域;在作用域角度来看,派生类继承了基类的成员,若没有定义该成员,可访问外层作用域(基类)中的成员,若派生类定义了该成员,则直接访问该成员。(当然有时要考虑访问权限和虚函数等问题)
发表于 2022-09-26 09:48:49 回复(0)
A
b.print()调用A的方法打印B的_a的值,_a的值A构造时先被赋值1再到B构造赋值2,所以打印2
printf("d",b._a)打印2
所以结果22
发表于 2015-01-08 17:27:54 回复(6)
试了一下,如果print改成虚函数,子类重写的话,就输出22了
发表于 2023-08-15 15:04:41 回复(0)
vscode运行结果是12
发表于 2022-08-18 19:22:17 回复(0)
在继承中,虽然子类继承了父类的函数,但父类的函数只能操作父类那个块域的数据,这个题中print函数子类是通过继承父类才拥有该函数,但你要是想让这个函数操作数据它只能操作父类中拥有的数据。
发表于 2022-07-21 18:14:33 回复(0)
b.print()函数的数据是从基类中获得的,
发表于 2018-06-20 11:44:19 回复(0)
子类虽然继承了父类的成员函数,但是函数中的this指针并没有改变所指向的对象
发表于 2018-06-14 15:21:36 回复(0)
派生类derive中声明了与基类base同种类型,相同名称的普通成员变量value时,派生类中的新成员变量会自动屏蔽掉基类中的成员变量,如果想通过派生类去访问基类成员变量value,必须使用基类类名和作用域运算符base::value,并且基类成员变量value必须是public类型或者protected类型。
发表于 2018-03-19 14:10:17 回复(0)
标记
发表于 2018-03-12 12:11:24 回复(0)
为什么我的编译出来的结果是22。。。
发表于 2018-01-29 10:32:24 回复(0)
子类可以存在与父类同名的成员变量,但是调用函数是要是子类没有这个函数,会调用父类的成员函数,调用的对象是从父类中找
发表于 2016-06-24 18:34:34 回复(0)