继承层次中中间类未实现虚方法时,执行哪个虚方法?
关于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
相关产品推荐
相关产品推荐

