class Base{
protected:
int a;
public:
Base(int x=1){a=x;}
virtual void print() { cout<<a; }
};
class Derived:public Base{
int b;
public:
Derived(int x) { b=x; }
void print() { cout<<a<<b; }
};
void f1(Base t) { t.print(); }
void f2(Base &t) { t.print(); }
void f3(Base *t) { t->print(); }
int main(void)
{
Derived b(2);
f1(b);
f2(b);
f3(&b);
system("pause");
return 0;
}
首先Base类是Derived类的基类,在实例化Derived类的对象b时传入了一个参数2,那么会调用子类的构造函数,也就是这个实参会传给子类而不是父类,父类会调用自身构造函数,并使用默认值1。构造后a=1,b=2;
之后对于f1,传入父类对象b=子类对象,那么则使用父类print函数打印a即为1
不懂再问,望采纳!
对于f2,传入的是父类引用b=子类对象,那么根据多态现象,子类重写了父类的虚函数,那么就调用子类的print函数打印a,b即1,2
对于f3,传入的是父类指针指向子类,*b=子类b,也会进行多态,调用子类print函数打印a,b即1,2
综上所述,则打印11212
不懂再问,望采纳!
f1(Base t) 知道传入的参数就是一个Base类型,不是任何其他类型,所以使用早捆绑(early bindding),直接调用基类的Base::print()函数,输出 1
f2(Base &t)和f3(Base *t)传入的参数都是地址,使用地址就意味着信息不全。这个地址指向的可能是基类Base,也可能是其他派生类,编译器不能确定,所以使用了晚捆绑(late binding)。这个就能保证调用到正确的函数Derived::print()。所以分别输出12和12。