万古教员有名言,自信人生二百年。 个人主页:oioihoii 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!
C++的多态特性是面向对象编程中的一个重要概念,它允许我们将子类对象当作父类对象来使用。这种特性的实现主要依赖于虚函数和虚函数表。
#include <iostream>
class Base {
public:
virtual void foo() {
std::cout << "Base::foo()" << std::endl;
}
};
class DerivedBase : public Base {
public:
virtual void foo() override {
std::cout << "DerivedBase::foo()" << std::endl;
}
};
class Derived : public DerivedBase {
public:
void foo() override {
std::cout << "Derived::foo()" << std::endl;
}
};
int main() {
Base* b = new Derived();
b->foo(); // 输出 "Derived::foo()"
delete b;
return 0;
}在C++中,多态是可以传递的。也就是说,如果一个类是另一个类的子类,那么这个类的对象也可以当作父类的对象来使用。这种传递性不仅适用于直接的父类和子类,也适用于更远的祖先类和后代类。
在下面的代码中,Derived类是DerivedBase类的子类,而DerivedBase类又是Base类的子类。因此,我们可以将Derived对象当作Base对象来使用。
Base* b = new Derived();
b->foo(); // 输出 "Derived::foo()"当我们创建一个Derived对象并将其赋值给Base指针b时,b的虚函数指针指向的是Derived类的虚函数表。因此,当我们通过b调用foo函数时,实际上调用的是Derived类的foo函数。
这就是多态的传递性。虽然b的类型是Base*,但是它实际上指向的是Derived对象,因此调用的是Derived类的foo函数。
在C++中,虚函数可以在子类中被重载。也就是说,子类可以提供一个与父类虚函数同名的函数,这个函数将覆盖父类的虚函数。
在上述代码中,Derived类、DerivedBase类和Base类都有一个名为foo的虚函数。当我们通过Base指针调用foo函数时,实际上调用的是Derived类的foo函数,因为Derived类的foo函数覆盖了Base类的foo函数。
void Derived::foo() {
std::cout << "Derived::foo()" << std::endl;
}这就是虚函数的重载。通过重载虚函数,子类可以改变父类虚函数的行为。
C++的多态特性和虚函数的重载为我们提供了强大的工具,使我们可以编写出更灵活、更易于维护的代码。理解这些概念,可以帮助我们更好地使用C++,编写出更高质量的代码。