c++,继承类的构造函数
发布网友
发布时间:2022-06-02 14:10
我来回答
共5个回答
热心网友
时间:2023-11-01 02:46
B没有print子函数,那么就调用A的print函数。
注意一点,A的print函数输出的是A的成员变量a
构造函数只是初始化了成员变量而已,但是你调用A的print,人家输出的就是A的成员变量a
而不是B的成员变量a。
B虽然继承了A,但是调用了A的成员函数,那么print中的变量依然是A的,而不是B的。
如果想实现你想的那种结果,那么你就要修改B的定义。
class B:public A
{
public:
int a;
B()
{
a=2;
}
};
你这么定义,实际的编译结果跟你想的是不一样的:
class B:public A
{
public:
int a;
int A.a;
B()
{
a=2;
}
A()
{
A.a = 1;
}
A.print()
{
printf("%d",A.a);
}
};
上述的代码才是编译后的形式。这你应该懂了吧。
望采纳。
若你想得到你想象中的那种结果,那么你可以如此修改B
class B:public A
{
public:
/*int a;*/ //此行注释掉就可以了。
B()
{
a=2;
}
};
热心网友
时间:2023-11-01 02:47
类B通过公有继承继承A,类B包含的数据成员有两个,a和A::a,调用B的默认构造函数初始化B,其实是先调用A()初始化A::a = 1;再初始化a = 2,相互并行存在,互不干扰。由于B类并没有重新定义print()函数,所以b.print()调用的其实是类a中的定义,它输出的是A::a,所以就是1啦。
热心网友
时间:2023-11-01 02:47
B 没有定义 print
所以
b.print();调用的是b.A::print();
由于print()不是虚函数所以 实际上这个函数输出的是父类的成员 b.A::a=1;
输出1;
由于B类定义了和父类同名的变量a ,相对更有全局性质的A类的同名变量,被遮蔽了(不是覆盖,两个变量同时存在)。
不过b.a 是 b.B::a;所以 printf("%d ",b.a);输出2;
A::a 只能通过作用域限定符访问即,b.A::a;
所以输出12
PS:
你可以同时访问A::a 和B::a;
例如
printf("A::a=%d,B::a=%d ",b.A::a,b.a);
可以这样查看一具体的地址
printf("&A::a=%p,&B::b=%p,&b.a=%p\n",&b.A::a,&b.B::a,&b.a);
结果如下:
&A::a=0022FE48,&B::b=0022FE4C,&b.a=0022FE4C
b.B::a,b.a 的地址相同,所以b.a,就是b.B::a;子类B定义的那个变量。
热心网友
时间:2023-11-01 02:48
跟据继承性和多态性原理,子类有的调用子类的。子类没有的。就调用父类的。b.print();由于子类没有这个函数。所以就调用父类的print(),所以打印出来的a的值是父类a的值。即为:1
热心网友
时间:2023-11-01 02:48
这个。。。构造函数理解对了
b.printf(); 输出的是A::a 不是 B::a