#include<iostream>
using namespace std;
struct B {
virtual void f()const { cout << "\tB::f" << endl; }
void g()const { cout << "\tB::g" << endl; }
};
struct D :B {
void f()const { cout << "\tD::f" << endl; } //与B::f类型相同,覆盖B::f
void g() { cout << "\tD::g" << endl; } //与D::g类型不同,未覆盖B::g
};
struct DD :D {
void f() { cout << "\tDD::f" << endl; } //不是const类型,与D::f类型不同,未覆盖D::f
void g()const { cout << "\tDD::g" << endl; } //与D::g类型不同,但与B::g类型相同
};
void call(const B&b)
{
b.f();
b.g();
}
int main() {
B b;
D d;
DD dd;
cout << "B:" << endl;
b.f();//B::f
b.g();//B::g
cout << "D:" << endl;
d.f();//D::f
d.g();//D::g
cout << "DD:" << endl;
dd.f();//DD::f
dd.g();//DD::g
cout << "call B:" << endl;
call(b);
cout << "call D:" << endl;
/*
调用call(d)时,因为D类中f()为虚函数覆盖了B类的f(),所以call(d)下d.f()的运行结果为:D::f,相当于执行D类的私有函数。
而call(d)下d.g()的运行结果为B::g。
*/
call(d);
cout << "call DD:" << endl;
/*
调用call(dd)时,因为DD类中f()函数与D类的不同,不覆盖,所以call(dd)下dd.f()的运行结果为:D::f,相当于执行D类中的f()函数。
而call(dd)下dd.g()的运行结果为B::g,因为DD类中的g()函数与D类中不同,所以再往上回溯,运行结果为B::g。
*/
call(dd);
}
c++ 虚函数覆盖
最新推荐文章于 2022-12-14 16:24:33 发布