今天这题出现了很多看不懂的,慢慢看吧
收了几个c++的题
1.对下面的程序段
编译运行后,程序输出结果是()
-
CB::f1() CC::f2()
-
CB::f1() CB::f2()
-
CB::f1() CA::f2()
-
CA::f1() CC::f2()
上边代码大约是酱紫的:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 class CA { 6 public: 7 virtual void f1 () { 8 cout << "CA::f1()" << endl; 9 f2(); 10 } 11 void f2 () { 12 cout << "CA::f2()" << endl; 13 } 14 }; 15 class CB : public CA { 16 public: 17 void f1 () { 18 cout << "CB::f1()" << endl; 19 f2(); 20 } 21 void f2 () { 22 cout << "CB::f2()" << endl; 23 } 24 }; 25 class CC : public CB { 26 public: 27 virtual void f2 () { 28 cout << "CC:f2()" << endl; 29 } 30 }; 31 int main (void) { 32 CC c; 33 CA *pa = &c; 34 pa -> f1(); 35 return 0; 36 }
某大牛的解题:
CA* pa = &c;这句话是父类指针指向子类对象,调用pa->f1()时,因为父类中的f1()是虚函数,所以将发生动态绑定,调用子类CB中的f1()函数,先输出CB::f1()
在CB类的f1()函数中,调用非虚函数f2(),但因为其父类CA中的f2()函数并不是virtual函数,所以将调用CB类中的f2()函数,输出CB::f2()。如果将CA类中的f2()改成虚函数,那么将输出CC::f2();如果将CB类中的f2()改成虚函数,也将输出CC::f2(),这是满足动态绑定的。
c++继承的坑还是挺大的,心累