本资源包含多种编程语言课程作业的答案与解析,旨在帮助学习者理解编程概念、提高代码编写能力,并提供实践案例以加深对理论知识的理解。
第 七 章 继承与派生
7-1 比较类的三种继承方式:public公有继承、protected保护继承、private私有继承之间的差别。
不同的继承方式,导致不同访问属性的基类成员在派生类中的访问属性也有所不同:
- 公有继承使得基类public(公有)和protected(保护)成员的访问属性在派生类中不变,而基类private(私有)成员不可访问。
- 私有继承使得基类public(公有)和protected(保护)成员都以private(私有)成员身份出现在派生类中,而基类private(私有)成员不可访问。
- 保护继承中,基类public(公有)和protected(保护)成员都以protected(保护)成员身份出现在派生类中,而基类private(私有)成员不可访问。
7-2 派生类构造函数执行的次序是怎样的?
派生类构造函数执行的一般次序为:
1. 调用基类构造函数;
2. 调用成员对象的构造函数;
3. 派生类的构造函数体中的内容。
7-3 如果在派生类B已经重载了基类A的一个成员函数fn1(),没有重载成员函数fn2(),如何调用基类的成员函数fn1()、fn2()?
调用方法为:
`A::fn1(); fn2();`
7-4 什么叫做虚基类?有何作用?
当某类的部分或全部直接基类是从另一个基类派生而来时,这些直接基类中从上一级继承来的成员拥有相同的名称。这时,在派生类的对象的内存中存在多个相同名字的成员拷贝。为解决这一问题,可以将共同的基类声明为虚基类。
在多继承情况下,设置虚基类的关键字可以在定义派生类时使用如下格式:
`class 派生类名:virtual 继承方式 基类名`
这表示直接基类从其上级继承来的成员只存在一个拷贝。这样可以避免同名成员的混淆问题。
7-5 定义一个Shape基类,在此基础上派生出Rectangle和Circle,二者都有GetArea()函数计算对象的面积。使用Rectangle类创建一个派生类Square。
以下是定义相关类的例子:
```cpp
#include
class Shape {
public:
Shape() {}
~Shape() {}
virtual float GetArea() { return -1; }
};
class Circle : public Shape {
public:
Circle(float radius): itsRadius(radius) {}
~Circle() {}
float GetArea() { return 3.14 * itsRadius * itsRadius; }
private:
float itsRadius;
};
class Rectangle : public Shape {
public:
Rectangle(float len, float width): itsLength(len), itsWidth(width) {};
~Rectangle() {};
virtual float GetArea() { return itsLength * itsWidth; }
virtual float GetLength() { return itsLength; }
private:
float itsWidth;
float itsLength;
};
class Square : public Rectangle {
public:
Square(float len);
~Square(){};
};
Square::Square(float len):Rectangle(len, len) {}
int main(){
Shape * sp;
sp = new Circle(5);
std::cout << The area of the Circle is << sp->GetArea() << std::endl;
delete sp;
sp = new Rectangle(4, 6);
}
```
注意,上述代码示例中省略了Square类的`main()`函数中的部分调用。在实际使用时需要完整地实现该功能以测试和展示派生类的功能。
这段描述展示了如何创建一个继承层次结构,并且正确实现了多态性(通过虚函数)。