C++ 继承
题目
- 下面关于继承说法不正确的是( )
A.继承可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展
B.继承体系中子类必须要体现出与基类的不同
C.子类对象一定比基类对象大
D.继承呈现了面相对象程序设计的层次结构,体现了有简单到复杂的认知过程
- B
B. ✅ 正确 子类是在基类基础上的特化或扩展,应当体现与基类的不同,否则没有必要存在子类。
C. ❌ 不正确
“子类对象一定比基类对象大”这个说法不准确。虽然子类通常会增加自己的属性和方法,但:
子类对象不一定在内存中比基类对象占用更大;
-
有的子类可能不添加新成员,只是重写方法;
-
对象大小也依赖于具体实现、编译器优化等因素。
- 下面说法正确的是( )
A.派生类构造函数初始化列表的位置必须显式调用基类的构造函数,已完成基类部分成员的初始化
B.派生类构造函数先初始化子类成员,再初始化基类成员
C.派生类析构函数不会自动析构基类部分成员
D.子类构造函数的定义有时需要参考基类构造函数
- D
A. 如果父类有默认构造函数,此时就不需要
- 关于基类与派生类对象模型说法正确的是()
A.基类对象中包含了所有基类的成员变量
B.子类对象中不仅包含了所有基类成员变量,也包含了所有子类成员变量
C.子类对象中没有包含基类的私有成员
D.基类的静态成员可以不包含在子类对象中
E.以上说法都不对
- E
静态成员一定是不被包含在对象中的
- 关于基类与子类对象之间赋值说法不正确的是( )
A.基类指针可以直接指向子类对象
B.基类对象可以直接赋值给子类对象
C.子类对象的引用不能引用基类的对象
D.子类对象可以直接赋值给基类对象
- B
C. 子类对象的引用不能引用基类的对象,因为这会破坏对象模型(缺失子类成员):
Base b;
Derived& dr = b; // ❌ 错误,类型不匹配
- 关于以下菱形继承说法不正确的是( )
A.D总共占了20个字节
B.B中的内容总共在D对象中存储了两份
C.D对象可以直接访问从基类继承的b成员
D.菱形继承存在二义性问题,尽量避免设计菱形继承
class B {public: int b;};
class C1: public B {public: int c1;};
class C2: public B {public: int c2;};
class D : public C1, public C2 {public: int d;};
- C
A. C1中b和c1共8个字节,C2中c2和b共8个字节,D自身成员d 4个字节,一共20字节
C. 子类对象不能直接访问最顶层基类B中继承下来的b成员,因为在D对象中,b有两份,一份是从C1中继承的,一份是从C2中继承的,直接通过D的对象访问b会存在二义性问题。在访问时候,可以加类名::b,来告诉编译器想要访问C1还是C2中继承下来的b。
学习过程中的一些记录
查看22道真题和解析