分析并调试下列程序,写出程序输出结果,并解释原因。 https://paste.ubuntu.com/p/ChnGPx4qGr/
#include < iostream>
using namespace std;
class B
{
public :
virtual void f1 ( )
{
cout << "B:f1()" << endl;
}
virtual void f2 ( )
{
cout << "B:f2()" << endl;
}
void f4 ( )
{
cout << "B:f4()" << endl;
}
void g ( )
{
cout << "B:g()" << endl;
f1 ( ) ;
f2 ( ) ;
; }
} ;
class D : public B
{
public :
void f1 ( )
{
cout << "D:f1()" << endl;
}
virtual void f3 ( )
{
cout << "D:f3()" << endl;
}
void f4 ( )
{
cout << "D:f4()" << endl;
}
void g ( )
{
cout << "D:g()" << endl;
f1 ( ) ;
f2 ( ) ;
}
} ;
int main ( )
{
D d;
D* pd = & d;
B* pb = & d;
B b = d;
cout<< "b.f1(); b的实例对象调用f1-----》为b类内的f1" << endl;
b. f1 ( ) ;
cout<< "b.f2(); b的实例对象调用f2-----》为b内的f2" << endl;
b. f2 ( ) ;
cout<< "b.g(); " << endl;
b. g ( ) ;
cout<< "pb->f1(); pb是一个声明为b类型的指针 实际上指向的对象是b的子类d 因为B内的f1为virtual类型 调用函数的时候 前面有一个this 经过查表 即调用的是指针指向的真正的对象 而不是声明的对象" << endl;
pb- > f1 ( ) ;
cout<< "pb->f2(); 因为D内没有重写父类的f2虚函数 所以调用的是父类B的f2" << endl;
pb- > f2 ( ) ;
cout<< "pb->g(); 普通类型的函数g 在g函数内调用了f1 和 f2 因为f1是virtual 所以调用是真实对像的函数【如果真实对象有这个函数 无论是不是virtual类型" << endl;
pb-<