c/c++ 继承与多态 静态调用与动态调用
程序员文章站
2023-04-05 16:36:55
静态调用,与动态调用。 动态调用条件:必须用父类的引用或者指针,并且调用的必须是虚方法。 运行结果: c/c++ 学习互助QQ群:877684253 本人微信:xiaoshitou5854 ......
静态调用,与动态调用。
动态调用条件:必须用父类的引用或者指针,并且调用的必须是虚方法。
#include <iostream> class base{ public: virtual int fcn(){ std::cout << "base fcn()" << std::endl; } }; class d1 : public base{ public: using base::fcn; int fcn(int){//形参与base的fcn不一致,所以隐藏了base的fcn std::cout << "d1 fcn(int)" << std::endl; } virtual void f2(){ std::cout << "d1 f2()" << std::endl; } }; class d2 : public d1{ public: int fcn(int){//隐藏了d1::fcn(int) std::cout << "d2 fcn(int)" << std::endl; } int fcn(){//覆盖了base的虚函数fcn std::cout << "d2 fcn()" << std::endl; } void f2(){//覆盖了d1的虚函数f2 std::cout << "d2 f2()" << std::endl; } }; int main(){ base b; d1 d1; d2 d2; d1.fcn(); base* bp1 = &b; base* bp2 = &d1; base* bp3 = &d2; bp1->fcn();//调用虚函数,将在运行时调用base::fcn bp2->fcn();//调用虚函数,将在运行时调用base::fcn bp3->fcn();//调用虚函数,将在运行时调用d2::fcn d1* d1p = &d1; d1* d2p = &d2; //bp2->f2();//‘class base’ has no member named ‘f2’ d1p->f2();//调用虚函数,将在运行时调用d1::f2 d2p->f2();//调用虚函数,将在运行时调用d2::f2 base* p1 = &d2; d1* p2 = &d2; d2* p3 = &d2; //p1->fcn(12);//error p2->fcn(12);//静态调用,调用d1::fcn(int) p3->fcn(12);//静态调用,调用d2::fcn(int) }
运行结果:
base fcn() base fcn() base fcn() d2 fcn() d1 f2() d2 f2() d1 fcn(int) d2 fcn(int)