在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...
输出20...
#2
20
派生类没有重载实现print(),调用的是派生类中基类对象。而基类对象中的i没有冲突,所以输出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
而构造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...
输出20...
#2
20
派生类没有重载实现print(),调用的是派生类中基类对象。而基类对象中的i没有冲突,所以输出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
而构造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 数据, 这些数据可否引用?