不加 virtual,哪怕子类写了同名函数,调用时也完全不会走多态——编译器直接按指针/引用的静态类型决定调用哪个函数。这是最常踩的坑:以为“名字一样+继承了”就自动多态,结果 Base* p = new Derived(); p->func(); 调的还是 Base::func()。
c++多继承菱形继承问题_c++虚继承解决方法
当一个派生类通过多条路径继承同…
技术博客
不加 virtual,哪怕子类写了同名函数,调用时也完全不会走多态——编译器直接按指针/引用的静态类型决定调用哪个函数。这是最常踩的坑:以为“名字一样+继承了”就自动多态,结果 Base* p = new Derived(); p->func(); 调的还是 Base::func()。
纯虚函数不是“必须写实现”,而是“必须在派生类里实现”,声明时用 = 0 结尾,且不能有函数体。常见错误是加了花括号、写了空实现,或者漏掉 = 0 导致编译器不认为它是纯虚函数。
函数重载(overload)不是真正意义上的“多态”语义,而是编译器根据实参类型在编译时选择具体函数版本。它不涉及继承或运行时决策,只是名字空间内多个同名函数的共存。
工厂方法模式在 C++ 中不是靠“教程步骤”堆出来的,而是为了解决「类继承体系下,调用方不依赖具体子类就能创建多态对象」这个实际问题。核心判断标准只有一条:如果你 new 的地方要写 if-else 判断类型再决定 new 哪个子类,那就该用工厂方法了。
当一个派生类通过多条路径继承同一个基类时,会生成多个该基类的子对象,造成访问歧义和内存冗余。比如 class A 是顶层基类,B 和 C 都继承自 A,而 D 同时继承 B 和 C —— 此时 D 对象里默认包含两份 A 的成员,调用 A::func() 会编译报错:error: request for member ‘func’ is ambiguous。