【牛客 题库】 virtual 函数 求输出结果

1.求输出结果

#include <iostream>
 
using namespace std;
 
class A
{
public:
    virtual void print()
    {
        cout << "A::print()" << "\n";
    }
};
 
class B: public A
{
public: virtual void print()
    {
        cout << "B::print()" << "\n";
    }
};
 
class C: public A
{
public: virtual void print()
    {
        cout << "C::print()" << "\n";
    }
};
 
void print(A a)
{
    a.print();
}
 
int main()
{
    A a, *aa, *ab, *ac;
    B b;
    C c;
    aa = &a;
    ab = &b;
    ac = &c;
    a.print();
    b.print();
    c.print();
    aa->print();
    ab->print();
    ac->print();
    print(a);
    print(b);
    print(c);
}

解答: A::print() B::print() C::print() A::print() B::print() C::print() A::print() A::print() A::print()

这里还是考察了 virtual虚函数的覆盖

 第一步: a.print();   b.print();   c.print();

a,b,c分别是A,B,C实例化的对象,所以会各自调用自己的print函数,所以先输出为:A::print() B::print() C::print()

第二步:aa->print(); ab->print();ac->print();

aa声明为A类型的指针,指向A类型的对象,所以调用的是A类的方法,输出:A::print()

  ab声明为A类型的指针,但是指向B类型的对象b,由于在基类中,print函数是虚函数,所以应该调用实际类型B的方法,输出B::print()

  ac声明为A类型的指针,指向C类型的对象c,由于基类中,print函数是虚函数,所以应该调用实际类型C的方法,输出C::print()

第三步:print(a);print(b);print(c);

void print(A a){ a.print();}

函数声明的形参为A类型的,相当于强制类型转换,因此调用print(A a)函数的输出都是A::print()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值