You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承层次中中间类未实现虚方法时,执行哪个虚方法?

关于C++虚函数继承行为的标准合规性解答

嘿,这个问题我门儿清,咱们直接说结论:你描述的这种情况——子类B继承基类A,但没重写A的虚函数f()——的行为完全符合C++标准,根本不存在编译器或平台依赖的问题,所有合规编译器都会按同一个逻辑处理。

具体拆解一下:

  • 不管你是直接创建B的对象调用f(),还是用指向B的A类指针/引用调用f(),最终都会执行基类A里的f()实现,这是C++多态机制的标准规则:子类没提供虚函数的重写版本时,就自动沿用基类的实现。

给你写段示例代码直观感受下,任何标准编译器跑出来结果都一样:

#include <iostream>
struct A { 
    virtual void f() { std::cout << "A::f()" << std::endl; } 
}; 
struct B : public A { 
    // 这里没有重写f()
}; 

int main() {
    A* ptr = new B();
    ptr->f(); // 铁定输出"A::f()"
    delete ptr;
    B b;
    b.f(); // 同样输出"A::f()"
    return 0;
}

顺便给你补充两个实用的标准细节:

  • 如果你想让代码意图更明确,C++11及以后可以在B类里加using A::f;,这不是必须的,但能清晰告诉阅读代码的人:B就是要继承A的f()。
  • 要是之后你想在B里重写f(),记得签名要和基类的虚函数完全匹配(包括const、引用限定符这些细节),或者直接用C++11的override关键字,比如void f() override { ... },这样只要签名不对编译器就会报错,避免不小心搞出不符合预期的行为。

内容的提问来源于stack exchange,提问作者FrozenTarzan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:05:14