若基类函数非虚,能否通过基类指针调用派生类虚函数?
基类无虚函数时的派生类函数调用问题
原代码示例
class Base { public: virtual void f() { g(); } virtual void g() { cout<<"base"; } }; class Derived : public Base { public: virtual void f() { Base::f(); } virtual void g() { cout<<"derived"; } }; int main() { Base *pBase = new Derived; pBase->f(); return 0; }
问题
原代码中基类与派生类的函数均被声明为虚函数,若基类函数未声明为虚函数,是否仍可通过基类指针调用派生类的虚函数?
解答
不行。C++的多态(动态绑定)机制有个核心前提:基类中对应的函数必须被声明为virtual。
如果基类的某个函数没加virtual,哪怕派生类把同名同签名的函数声明为虚函数,用基类指针调用该函数时,编译器会在编译阶段就确定调用基类的版本,不会根据指针指向的实际对象类型去调用派生类的函数。
比如修改原代码,去掉基类函数的virtual:
class Base { public: void f() { g(); } void g() { cout<<"base"; } }; class Derived : public Base { public: virtual void f() { Base::f(); } virtual void g() { cout<<"derived"; } }; int main() { Base *pBase = new Derived; pBase->f(); // 最终调用Base::g,输出"base" return 0; }
这里pBase指向的是Derived对象,但因为基类的f和g都不是虚函数,调用pBase->f()时,只会执行基类的f,进而调用基类的g,完全不会触发派生类的函数。
简单说:基类没把函数声明为虚,基类指针就只能调用基类的函数,碰不到派生类的同名虚函数。
内容的提问来源于stack exchange,提问作者iso42
相关产品推荐
相关产品推荐

