北京大学程序设计MOOC作业详解-05-继承

第一题:

北京大学程序设计MOOC作业详解-05-继承_限定符

第一题分析:

类的发展演变,就是“继承”。比如说,飞机的基类有引擎和翅膀。而客机就会有大量的乘客座位;战斗机则会安装武器;加油机则会带有燃油。但是,它们都有共同的特点:有翅膀和引擎。这些就是基类的特征,而后续演变出来的各种类型的飞机,就是派生类。

因此,本题选C

第二题:

北京大学程序设计MOOC作业详解-05-继承_c++_02

第二题分析:

派生关系是满足“is a”的,即:派生类一定也是基类。分析上面的选项:
1)点和圆的关系,可以说“圆也是点”吗?不能吧,实际上:圆=点(圆心)+半径,所以是“has a”的关系,这种关系是用封闭类完成的
2)哺乳动物一定是爬行动物吗?人就不是吧,所以也不对;
3)飞虫一定是虫子吗?这肯定是,飞虫在继承虫子后,增加了会飞的行为;
4)狗和狼杂交可以得到狼狗,但狼狗一定是狗,一定不是狼,所以不对。

综上所述,本题选C

第三题:

北京大学程序设计MOOC作业详解-05-继承_派生类_03

第三题分析:

这种情况叫覆盖,但并非基类的同名函数就没用了,也可以通过 “基类::” 在派生类中调用基类的函数,因此本题选B

第四题:

北京大学程序设计MOOC作业详解-05-继承_限定符_04

第四题分析:

继承可以有同名函数,参数表相同也是可以的,是重载。派生类可以用基类名和作用域限定符调用基类的函数。继承关系可以有同名变量,但是访问时,要用基类和作用域限定符(​​Base::var​​)加以区分。因此,本题选D

第五题:

北京大学程序设计MOOC作业详解-05-继承_限定符_05

第五题分析:

构造和析构的顺序,仍然遵循:非指针变量,先构造的后析构。是先有基类,后有派生类,因此是先构造基类对象,后构造派生类对象;先析构派生类对象,后析构基类对象

本题的C选项,这个要看是派生类的什么构造函数。如果是拷贝构造,仍然是要带初始化列表的。因此,本题选D

声明:本题我做错了! 答案是选C,这里有一些歧义:D选项“可以”是不是打错字的。然后C选项,这事不绝对,但是题目说的是“可以”,所以选C是对的。没必要纠结文字,但是要说明问题

第六题:

直接给代码吧,有问题请留言:

class MyString
{
private:
char* m_data;
size_t m_size;
public:
MyString(const char* data = nullptr) {
if (!data) {
m_data = nullptr;
m_size = 0;
return;
}
m_size = strlen(data);
m_data = new char[m_size + 1];
strcpy(m_data, data);
}

MyString(const char* data, int i, int len) {
if (!data) {
m_data = nullptr;
m_size = 0;
return;
}
m_size = len;
m_data = new char[m_size + 1]();
for (size_t j = 0; j < m_size; ++j) {
m_data[j] = data[i + j];
}
m_data[m_size] = '\0';
}

MyString(const MyString& str)
: m_data(nullptr), m_size(str.m_size) {
if (!str.m_data) { return; }
m_data = new char[m_size + 1]();
for (size_t i = 0; i < m_size; ++i) {
m_data[i] = str.m_data[i];
}
m_data[m_size] = '\0';
}

MyString& operator=(const MyString& str) {
if (this == &str) { return *this; }
if (m_data) { delete[] m_data; }
m_size = str.m_size;
if (!str.m_data) {
m_data = nullptr;
return *this;
}
m_data = new char[m_size + 1]();
for (size_t i = 0; i < m_size; ++i) {
m_data[i] = str.m_data[i];
}
m_data[m_size] = '\0';
return *this;
}

char& operator[](int idx) {
return m_data[idx];
}

MyString& operator+=(const MyString& str) {
if (!m_data) {
m_size = str.m_size;
m_data = new char[m_size + 1]();
strcpy(m_data, str.m_data);
return *this;
}
else if (!str.m_data) {
return *this;
}
char* temp = m_data;
m_size += str.m_size;
m_data = new char[m_size + 1]();
strcpy(m_data, temp);
strcat(m_data, str.m_data);
delete[] temp;
temp = nullptr;
return *this;
}

MyString operator+(const MyString& str) {
MyString ret(*this);
ret += str;
return ret;
}

bool operator<(const MyString& str) const {
return (strcmp(m_data, str.m_data) < 0);
}

bool operator>(const MyString& str) const {
return (strcmp(m_data, str.m_data) > 0);
}

bool operator==(const MyString& str) const {
return (!strcmp(m_data, str.m_data));
}

MyString operator()(int i, int len) {
return MyString(m_data, i, len);
}

friend MyString operator+(const char* str1, const MyString& str2) {
MyString ret(str1);
ret += str2;
return ret;
}

friend ostream& operator<< (ostream & os, const MyString & str) {
for (size_t i = 0; i < str.m_size; ++i) {
os << str.m_data[i];
}
return os;
}
};

第七题:

请查看前面的博客,​​魔兽世界大作业(二)-装备​​