继承与派生:同名隐藏与访问规则

需积分: 16 1 下载量 135 浏览量 更新于2024-07-14 收藏 158KB PPT 举报
"同名隐藏规则在继承与派生中的应用" 在面向对象编程中,继承是类之间的一种关系,允许一个类(派生类)从另一个类(基类)继承属性和行为。这种机制使得代码重用变得更加高效,同时也能实现更复杂的层次结构。在C++或类似的面向对象语言中,当派生类与基类存在同名成员时,就会涉及到"同名隐藏规则"。 同名隐藏规则指出,如果派生类中定义了与基类相同的成员(包括方法或变量),那么默认情况下,通过派生类的对象访问这些同名成员时,会优先使用派生类自身的定义,而不是基类的定义。这是为了确保派生类能够根据需要添加或修改基类的行为。 例如,我们有这样一个基类`Car`,它包含了一些汽车的基本特征,如车轮数、行程里数、发动机排气量等。然后,我们创建了两个派生类:`Convertible`(敞篷车)和`Truck`(货车)。这两个派生类可能都从`Car`继承,但是它们都有各自独特的一些属性,比如敞篷车的“是否敞蓬”和货车的“最大装货量”和“货箱体积”。 ```cpp Class Car { public: Car(); int WheelNum(); // 车轮数 Long MileMeter(); // 行程里数 Int EngineMeter(); // 发动机排气量 Char* CarSound(); // 车载音响系统品牌 Bool IsOpen(); // 是否敞蓬 Int Comfort(); // 舒适度 private: Int m_wheelNum; Long m_milemeter; Int m_enginemeter; Char* m_carsoundname; Bool m_isOpen; Int m_comfort; } Class Convertible : public Car { ... } // 敞篷车类 Class Truck : public Car { ... } // 货车类 ``` 在这样的继承结构中,如果`Convertible`类和`Truck`类都重写了`IsOpen()`,那么在使用`Convertible`或`Truck`对象时,`IsOpen()`将默认调用各自派生类的实现,而不是基类`Car`的版本。如果需要在派生类对象中调用基类的`IsOpen()`,则需要使用基类名限定,如下所示: ```cpp Convertible myConvertible; myConvertible.Car::IsOpen(); // 访问基类Car的IsOpen() ``` 类型兼容原则指出,任何对基类适用的操作都可以应用于派生类。这意味着,如果你有一个函数或方法接受`Car`类型的参数,你可以传递一个`Convertible`或`Truck`实例,因为它们都是`Car`的子类。 在继承时,构造函数和析构函数的调用顺序是需要注意的。基类的构造函数会在派生类构造函数之前被调用,而析构函数的调用顺序则相反,先调用派生类的析构函数,然后是基类的析构函数。这是因为派生类构造时需要先初始化基类部分,而析构时需要确保基类部分的清理工作在派生类部分之后完成。 多级继承可能会导致同名成员的访问问题。为了解决这个问题,可以使用虚基类(virtual base class)。虚基类确保所有派生自同一虚基类的派生类只有一个该基类的实例,避免了二义性。 同名隐藏规则是面向对象编程中一个重要的概念,它帮助我们理解如何在派生类中正确地处理与基类共享的成员,并提供了通过基类名限定来访问基类成员的方法。理解并掌握这个规则,对于构建灵活、可扩展的类层次结构至关重要。