C++:非虚函数下基类指针与子类指针赋值的深入解析

1 下载量 157 浏览量 更新于2024-08-30 收藏 129KB PDF 举报
在C++编程中,理解基类指针和子类指针的相互赋值是一个关键概念,特别是在面向对象编程中继承和多态的应用。本文档主要关注于非虚函数的情况,通过实例说明如何将子类指针赋值给基类指针,并探讨这种赋值行为对函数调用的影响。 首先,我们定义了一个基础类`animal`,它有一个非虚函数`breathe()`,表示所有动物的基本呼吸行为。然后,我们创建了一个名为`fish`的子类,它继承自`animal`,同样拥有一个`breathe()`函数。这个子类可能具有特定于鱼类的呼吸方法。 在C++中,当一个子类指针被赋值给基类指针时,通常不会发生自动类型转换。这意味着,如果试图将一个`fish`类型的指针赋值给`animal`类型的指针,编译器并不会自动改变指针的实际指向,而是保留子类指针的底层地址。然而,如果该子类没有重写基类的虚函数,那么调用基类指针所指向的对象的函数时,将会执行基类中的函数,而非子类版本。 例如,在`animal.h`文件中,我们有: ```cpp void fish::breathe() { cout << "fish breathe" << endl; } int main() { // 创建一个鱼的实例并将其地址赋给一个animal指针 fish myFish; animal* animalPtr = &myFish; // 子类指针赋值给基类指针 // 当通过animalPtr调用breathe()时,会执行animal类的breathe()函数 animalPtr->breathe(); // 输出 "animal breathe" return 0; } ``` 在这个例子中,尽管`animalPtr`指向的是`fish`对象,但由于`breathe()`函数在`animal`类中并未声明为虚函数,因此调用`animalPtr->breathe()`时,实际调用的是`animal`类的`breathe()`,而不是`fish`类的版本。 总结来说,C++中基类指针和子类指针的相互赋值涉及到类型安全和多态性。在非虚函数场景下,虽然可以进行赋值操作,但调用的是基类的函数,除非在基类中显式声明函数为虚函数,以便支持动态绑定。这体现了面向对象设计中的静态和动态特性的权衡。理解这些概念对于编写高效、灵活的C++代码至关重要。