基类的私有成员和派生类私有成员同名,派生类调用基类public函数中使用的是基类还是派生类的变量?

时间:2022-11-09 20:01:12
RT
在OOP的卷子中做到一道题

class Base {
public:
Base():i(1) { f(); }
virtual void f() { i *= 20; }
virtual void print() { cout <<i << endl; }
private:
int i;
};

class Derived : public Base {
public:
Derived():i(2) { }
void f() { i*=30; }
private:
int i;
};
void main()
{
    Base *p = new Derived;
p->print();
}


求问程序输出什么值?

11 个解决方案

#1


调用Base()构造 i=20 ;调用子类构造.. 
    输出20... 

#2


20
派生类没有重载实现print(),调用的是派生类中基类对象。而基类对象中的i没有冲突,所以输出20。

#3


基类的函数当然只使用基类的变量。

#4


对,我也知道调用的是基类的构造函数,但我觉得既然f()是virtual的,基类f()应该被派生类的f()覆盖了,输出应该是30啊? 但答案确实是20

#5


永远不要在构造函数中调用虚函数

#6


嗯,自己写的时候肯定不会的。 这是一道c++课程的考试题

#7


derive class构造的时候是先构造base class,
而构造base class的时候其实对象还是个base class object,也就是vfptr这时指向的是base vfptr,
所以会调用到base f()
base class构造完成后,构造继续执行,这时才改写vfptr指向derive class 的vfptr

#8


虚机制在构造函数不起作用的

#9


原来是这样,声明派生类的时候会把它所继承的基类的构造函数都执行一遍么?

#10


会的,在构造本类之前,先构造基类的部分,然后其成员的部分

#11


请问B类 PUBLIC 继承A类,在建立B 对象时候,B对象本身已经包含A的private 数据, 这些数据可否引用?

#1


调用Base()构造 i=20 ;调用子类构造.. 
    输出20... 

#2


20
派生类没有重载实现print(),调用的是派生类中基类对象。而基类对象中的i没有冲突,所以输出20。

#3


基类的函数当然只使用基类的变量。

#4


对,我也知道调用的是基类的构造函数,但我觉得既然f()是virtual的,基类f()应该被派生类的f()覆盖了,输出应该是30啊? 但答案确实是20

#5


永远不要在构造函数中调用虚函数

#6


嗯,自己写的时候肯定不会的。 这是一道c++课程的考试题

#7


derive class构造的时候是先构造base class,
而构造base class的时候其实对象还是个base class object,也就是vfptr这时指向的是base vfptr,
所以会调用到base f()
base class构造完成后,构造继续执行,这时才改写vfptr指向derive class 的vfptr

#8


虚机制在构造函数不起作用的

#9


原来是这样,声明派生类的时候会把它所继承的基类的构造函数都执行一遍么?

#10


会的,在构造本类之前,先构造基类的部分,然后其成员的部分

#11


请问B类 PUBLIC 继承A类,在建立B 对象时候,B对象本身已经包含A的private 数据, 这些数据可否引用?