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()