能否在C++类层次结构中抑制函数的虚特性?
C++虚函数继承中能否抑制虚特性?
问题描述
这是一个纯理论问题,无特定应用场景:能否在C++类层次结构的某个下层位置抑制函数的虚特性?还是说一旦在基类中定义了虚函数,它在整个类层次结构的后续部分都会保持虚特性?
尝试的示例代码:
class Base { public: virtual void myFunc() { std::cout << "myFunc in Base" << std::endl; } }; class Child : public Base { public: void myFunc() { std::cout << "myFunc in Child" << std::endl; } }; class GrandChild : public Child { public: void myFunc() { std::cout << "myFunc in GrandChild" << std::endl; } }; int main() { Base* ptr = new GrandChild(); ptr->myFunc(); return 0; }
输出结果:
myFunc in GrandChild
解答
一旦在基类中将某个函数声明为virtual,整个继承层次结构中所有与该函数签名匹配的同名函数都会自动成为虚函数,无法在下层类中取消其虚特性。
你示例代码里,Base::myFunc是虚函数,Child::myFunc即便没显式写virtual,也自动继承了虚特性;同理GrandChild::myFunc也是虚函数。当通过Base*指针调用myFunc时,C++会执行动态绑定,根据指针指向的实际对象类型(GrandChild)调用对应函数,所以输出是myFunc in GrandChild。
如果想让下层类的同名函数脱离虚函数机制,唯一办法是使用不同的函数名——只要签名匹配,继承链里的函数就会保持虚特性,无法被“抑制”。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

