如果在派生类中重新定义了public继承而来的非虚函数,则将派生类的引用或指针转换为基类的引用或指针后,将调用到不同 的函数,
时间: 2024-04-17 09:26:57 浏览: 83
是的,当派生类重新定义了基类中的非虚函数时,如果通过基类的指针或引用调用该函数,将会调用到基类中的函数而不是派生类中重新定义的函数。这种情况被称为静态绑定(static binding)或早绑定(early binding)。
下面是一个示例代码:
```cpp
#include <iostream>
class Base {
public:
void print() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Derived derivedObj;
Base* basePtr = &derivedObj;
basePtr->print(); // 输出: Base class
Derived& derivedRef = derivedObj;
derivedRef.print(); // 输出: Derived class
return 0;
}
```
在上面的例子中,`Base` 类有一个非虚函数 `print()`,`Derived` 类继承自 `Base` 类,并重新定义了 `print()` 函数。
在 `main()` 函数中,我们创建了一个 `Derived` 类的对象 `derivedObj`。然后,我们声明了一个 `Base` 类型的指针 `basePtr`,将其指向 `derivedObj` 对象。接着,我们通过指针调用了 `print()` 函数。
尽管 `basePtr` 是一个 `Base` 类型的指针,但它指向的实际是一个 `Derived` 类型的对象。由于我们在派生类中重新定义了 `print()` 函数,但它不是虚函数,因此静态绑定规则会导致调用基类中的函数。所以输出为 "Base class"。
同样地,如果我们通过引用调用 `print()` 函数,结果也会相同。
这个例子说明了当派生类重新定义了非虚函数时,调用函数的具体实现取决于指针或引用的静态类型,而不是动态类型。如果想要实现动态绑定,需要将函数声明为虚函数。
阅读全文