几道题和参考答案

请详细说明以下两个接口有什么异同,各有什么优缺点
A   接口:
void GameStart ( Game & game )       //Game 为一个虚基类, Start() 为虚函数
{
game .Start();
}
B 接口:
template < typename T>
void GameStart ( T & game )
{
game .Start();
}


参考答案:
同:A和B都使用了多态机制,调用的类中如果没实现Start()编译时都会报错
异:A中Start()为显示接口,属于运行时多态,;B中为隐式接口,编译时多态
A 优点(运行时多态的优点):
面相对象设计中重要的特性,对客观世界直觉认识。
能够处理同一个继承体系下的异质类集合。
A 缺点(运行时多态的缺点):
运行期间进行虚函数绑定,提高了程序运行开销。
庞大的类继承层次,对接口的修改易影响类继承层次。
由于虚函数在运行期在确定,所以编译器无法对虚函数进行优化。
B 优点(编译时多态的优点):
它带来了泛型编程的概念,使得C++拥有泛型编程与STL这样的强大武器。
在编译器完成多态,提高运行期效率。
具有很强的适配性与松耦合性,对于特殊类型可由模板偏特化、全特化来处理。
B 缺点(编译时多态的缺点):
程序可读性降低,代码调试带来困难。
无法实现模板的分离编译,当工程很大时,编译时间不可小觑。
无法处理异质对象集合。




 这是一个单例模式的实现,请丰富下面的代码,解决该模式合适的时候释放m_pInstance指向空间的问题。
class CSingle
{
 public:
 static CSingle * GetInstance()
 {
 if(m_pInstance == NULL)
 m_pInstance = new CSingle();
 return m_pInstance;
 }
 private:
 CSingle(){};
 static CSingle * m_pInstance;
 // 添加代码
}


(2)
class Engine
{
//
}
class Underpan
{
//
}
class Wheel
{
//
}
class Car
{
public:
 Car(Underpan u, Wheel w, Engine e)()
 {
 }
 fun()
 {
 //dosomething
 }
}
// 以下为需改造的代码
int main(int argc, char* argv[])
{
 Engine engine = Engine();
 Underpan underpan = Underpan();
 Wheel wheel = Wheel();
 ICar* car = new Car(underpan,
        wheel, engine);
 car.fun();
 if(car != NULL)
 {
 delete car;
 car = NULL;
 }
 return 0;
}
// 以上为需改造的代码






使用工厂方法模式将以上需改造部分的代码重写一下


参考答案:
(1)答:
class Garbo
{
public:
~Garbo(){
if(CSingle::pInstance != NULL)
delete CSingle::pInstance;
}
}
static Garbo garbo;
(2) 答:
class IFactory
{
public:
virtual ICar* createCar();
}


class Factory :IFactory
{
public:
virtual ICar* createCar()
{
Engine engine = Engine();
Underpan underpan = Unerpan();
Wheel wheel = Wheel();
ICar* pCar = new Car(unerpan, wheel, engine);
return pCar;
}
}


int main(int argc, char* argv[])
{
Factory * pF = new Factory();
ICar* pCar = pF.createCar();
car.fun();
if(pF != NULL)
{
delete pF;
pF = NULL;
}
if(pCar != NULL)
{
delete pCar;
pCar = NULL;
}
return 0;
}






C++中使用模板类的优点是什么?




参考答案:
1 可以来创建动态增长和减小的数据结构
2 与类型无关,因此具有很高的可复用性
3 在编译时而不是运行时检查数据类型,保证了类型安全
4 与平台无关,可移植性好
5 可用于基本数据类型

猜你喜欢

转载自blog.csdn.net/icebergliu1234/article/details/80633011
今日推荐