子类重写虚函数却引用到了父类的虚函数
时间: 2025-06-03 07:19:09 浏览: 35
### 子类重写虚函数时引用父类虚函数的原因
在 C++ 中,当子类重写父类的虚函数时,调用机制是由对象的实际类型决定的,而不是由指针或引用的静态类型决定的。这种行为是通过虚函数表(vtable)实现的[^1]。每个包含虚函数的类都会生成一个虚函数表,该表存储了指向实际虚函数实现的指针。当通过基类指针或引用调用虚函数时,程序会根据对象的实际类型查找对应的虚函数表,并调用正确的函数。
如果子类没有完全覆盖某个虚函数或者调用了 `Base::function()`,那么它会显式地调用父类版本的虚函数。这是因为在 C++ 中,`override` 关键字只是确保子类中的函数与父类中的虚函数签名匹配,但并不会阻止子类直接调用父类的实现[^2]。
---
### 调用父类虚函数的行为分析
当子类中存在以下代码时:
```cpp
class Base {
public:
virtual void func() {
std::cout << "Base::func()" << std::endl;
}
};
class Derived : public Base {
public:
void func() override {
Base::func(); // 显式调用父类的虚函数
std::cout << "Derived::func()" << std::endl;
}
};
```
在这种情况下,`Derived::func()` 会先调用 `Base::func()`,然后执行自身的逻辑。这是由于子类可以通过 `Base::` 的方式显式访问父类的成员函数,包括虚函数。即使 `func()` 是虚函数,这种方式仍然允许子类控制调用顺序和行为[^3]。
---
### 解决方案:避免不必要调用父类虚函数
如果希望子类的虚函数完全替代父类的实现,而不涉及父类的逻辑,则需要确保子类的实现中不显式调用 `Base::func()`。例如:
```cpp
class Derived : public Base {
public:
void func() override {
std::cout << "Derived::func()" << std::endl; // 不调用 Base::func()
}
};
```
此外,可以使用纯虚函数来强制子类提供自己的实现,从而避免父类虚函数被调用。例如:
```cpp
class Base {
public:
virtual void func() = 0; // 纯虚函数
};
class Derived : public Base {
public:
void func() override {
std::cout << "Derived::func()" << std::endl;
}
};
```
通过定义纯虚函数,`Base` 类成为抽象类,无法实例化,同时确保所有派生类必须提供自己的实现[^4]。
---
### 总结
子类重写虚函数时可能引用到父类虚函数的原因在于 C++ 的多态机制和虚函数表的设计。子类可以通过显式调用 `Base::func()` 来调用父类的虚函数实现。为了避免这种情况,可以通过设计避免显式调用父类函数,或者使用纯虚函数强制子类提供独立的实现。
---
阅读全文
相关推荐


















