Effective C++ 条款34 区分接口继承和实现继承

关于接口继承和实现继承:

所谓接口继承,就是派生类只继承函数的接口,也就是声明;而实现继承,就是派生类同时继承函数的接口和实现。

纯虚函数:要求继承类必须含有某个接口,并对接口函数实现。
虚函数:继承类必须含有某个接口,可以自己实现,也可以不实现,而采用基类定义的缺省实现。
非虚函数:继承类必须含有某个接口,必须使用基类的实现。


关于飞机问题代码如下:

#include <iostream>
#include <cstring>
using namespace std;
class Airport
{
public:
Airport(){}
Airport(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport(const Airport& Ap )
{
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);

}


void SetDestination(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport& operator=(const Airport& Ap )
{
if (this==&Ap)
return *this;
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);
return *this;
}

void show() const//这里一定要加const,因为若不加const,在调用destination.show()时会报错,
                //因为destination为const Airport的引用
{
cout<<"The destination is :"<<des<<endl;
}

private:
char* des;

};


class Airplane
{

public:
    virtual void fly(const Airport& destination);

};

void Airplane::fly(const Airport& destination)
{
destination.show();
}

class ModelA:public Airplane
{

};

class ModelB:public Airplane
{

};


class ModelC:public Airplane
{

};




int main()
{

    Airport PDX("ChengDu");
    Airplane* pa=new ModelC;
    pa->fly(PDX);
    Airplane* pb=new ModelA;
    pb->fly(PDX);
    return 0;
}

由于C也为声明fly函数,所以会调用缺省的的Airplane::fly,从而本该飞行方式不同的C采用了和A、B相同的飞行方式;


#include <iostream>
#include <cstring>
using namespace std;
class Airport
{
public:
Airport(){}
Airport(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport(const Airport& Ap )
{
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);

}


void SetDestination(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport& operator=(const Airport& Ap )
{
if (this==&Ap)
return *this;
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);
return *this;
}

void show() const//这里一定要加const,因为若不加const,在调用destination.show()时会报错,
                //因为destination为const Airport的引用
{
cout<<"The destination is :"<<des<<endl;
}

private:
char* des;

};


class Airplane
{

public:
    virtual void fly(const Airport& destination)=0;

};

void Airplane::fly(const Airport& destination)
{
destination.show();
}

class ModelA:public Airplane
{

};

class ModelB:public Airplane
{

};


class ModelC:public Airplane
{

};




int main()
{

    Airport PDX("ChengDu");
    Airplane* pa=new ModelC;
    pa->fly(PDX);
    Airplane* pb=new ModelA;
    pb->fly(PDX);
    return 0;
}

可是如果将类Airplane中的fly声明为纯虚函数,虽然有定义,但是此时ModelA等就不能缺省了,因为

纯虚函数最突出的特产就是它必须被任何继承了它们的类重新声明,通常纯虚函数在抽象类没有定义,但是也可以定义,但是调用它的唯一途径是“调用时明确指出其类的名称”如下所示:

#include <iostream>
#include <cstring>
using namespace std;
class Airport
{
public:
Airport(){}
Airport(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport(const Airport& Ap )
{
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);

}


void SetDestination(char *p)
{
int len=strlen(p);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,p);
}

Airport& operator=(const Airport& Ap )
{
if (this==&Ap)
return *this;
int len=strlen(Ap.des);
delete [] des;
des=NULL;
des=new char[len+1];
strcpy(des,Ap.des);
return *this;
}

void show() const//这里一定要加const,因为若不加const,在调用destination.show()时会报错,
                //因为destination为const Airport的引用
{
cout<<"The destination is :"<<des<<endl;
}

private:
char* des;

};


class Airplane
{

public:
    virtual void fly(const Airport& destination)=0;

};

void Airplane::fly(const Airport& destination)
{
destination.show();
}

class ModelA:public Airplane
{
virtual void fly(const Airport& destination)
{
cout<<"ModelA"<<endl;
Airplane::fly(destination);
}
};

class ModelB:public Airplane
{
virtual void fly(const Airport& destination)
{
cout<<"ModelB"<<endl;
Airplane::fly(destination);
}
};


class ModelC:public Airplane
{
virtual void fly(const Airport& destination)
{
cout<<"ModelC"<<endl;
Airplane::fly(destination);
}
};

int main()
{

    Airport PDX("ChengDu");
    Airplane* pa=new ModelC;
    cout<<"1: "<<endl;
    pa->Airplane::fly(PDX);
    cout<<"2: "<<endl;
    pa->fly(PDX);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值