您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer Plus(第六版)》(29)(第十四章 C++中的代码重用 复习题答案)

2016-12-28 21:14 676 查看
14.6 复习题

1.以A栏的类为基类时,B栏的类采用共有派生还是私有派生更合适。

AB派生类型
class Bearclass PolarBear公有派生
class Kitchenclass Home私有派生
class Personclass Programmer公有派生
class Personclass HorseAndJockey私有派生
class Person, class Automobileclass Driver人是公有派生,汽车是私有派生
2.假设有下面的定义:

class Frabjous
{
private:
char fab[20];
public:
Frabjous(const char* s = "C++") :fab(s){}
virtual void tell(){ cout << fab; }
};

class Gloam
{
private:
int glip;
Frabjous fb;
public:
Gloam(int g = 0, const char* s = "C++");
Gloam(int g, const Frabjous& f);
void tell();
};


假设Gloam版本的tell()应显示glip和fb的值,请为这3个Glom方法提供定义。

class Frabjous
{
private:
char fab[20];
public:
Frabjous(const char* s = "C++")
{
strcpy_s(fab, 20, s);
}
virtual void tell(){ cout << fab; }
};

class Gloam
{
private:
int glip;
Frabjous fb;
public:
Gloam(int g = 0, const char* s = "C++") :fb(s), glip(g){}
Gloam(int g, const Frabjous& f) : fb(f), glip(g){}
void tell()
{
fb.tell();
cout << glip << endl;
}
};
好像VS对一些字符串的处理有了更多的限制。

3.假设有下面的定义:

class Frabjous
{
private:
char fab[20];
public:
Frabjous(const char* s = "C++")
{
strcpy_s(fab, 20, s);
}
virtual void tell(){ cout << fab; }
};

class Gloam : private Frabjous
{
private:
int glip;
public:
Gloam(int g = 0, const char* s = "C++");
Gloam(int g, const Frabjous& f);
void tell();
};
假设Gloam版本的tell()应显示glip和fab的值,请为这3个Gloam方法提供定义。

class Frabjous
{
private:
char fab[20];
public:
Frabjous(const char* s = "C++")
{
strcpy_s(fab, 20, s);
}
virtual void tell(){ cout << fab; }
};

class Gloam : private Frabjous
{
private:
int glip;
public:
Gloam(int g = 0, const char* s = "C++") :Frabjous(s), glip(g){}
Gloam(int g, const Frabjous& f) : Frabjous(f), glip(g){}
void tell()
{
Frabjous::tell();
cout << glip << endl;
}
};


4.假设有下面的定义,它是基于程序清单14.13中的Stack模板和程序清单14.10中的Worker类的:

Stack<Worker * > sw;

请写出将生成的类声明。只实现类声明,不实现非内联类方法。

class Stack<Worker*>
{
private:
enum{ MAX = 10 };
Worker* items[MAX];
int top;
public:
Stack();
bool isempty();
bool isfull();
bool push(const Worker*& item);
bool pop(Worker* & item);
};

Stack<Worker*>::Stack()
{
top = 0;
}

bool Stack<Worker*>::isempty()
{
return top == 0;
}

bool Stack<Worker*>::push(const Worker*& item)
{
if (top < MAX)
{
items[top++] = item;
return true;
}
else
{
return false;
}
}

bool Stack<Worker*>::pop(Worker* & item)
{
if (top > 0)
{
item = items[--top];
return true;
}
else
{
return false;
}
}


5.使用本章中的模板定义对下面内容进行定义:

string对象数组

double数组栈

指向Worker对象的指针栈数组。

程序清单14.18生成了多少个模板类定义?

ArrayTP<string> sa;

StackTP<ArrayTP<double> > stack_arr_db;

ArrayTP< StackTP<Worker*> > arr_stk_wpr;

程序清单14.18,生成了四种模板:ArrayTP<int, 10>, ArrayTP<double, 10>,ArrayTP<int,5>,Array<ArrayTP<int,5>,10>

6.指出虚基类与非虚基类之间的区别。

对于非虚基类,如果两条继承路线有相同的祖先,则类中将包含祖先成员的两个拷贝

虚基类可以解决这种问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐