Effective C++第七章-模板和泛型编程之编译期多态(运行期多态)和隐式接口(显式接口)

运行期多态(虚函数)和编译器多态(模板)

运行期多态的说明示例:

class Animal    //基类
{
public :
    virtual void shout() = 0;
};
class Dog :public Animal
{
public:
    virtual void shout(){ cout << "汪汪!"<<endl; }
};
class Cat :public Animal
{
public:
    virtual void shout(){ cout << "喵喵~"<<endl; }
};

void main()
{
    Animal * anim1 = new Dog;
    Animal * anim2 = new Cat;
   //藉由指针(或引用)调用的接口,在运行期确定指针(或引用)所指对象的真正类型,调用该类型对应的接口--运行期多态
    anim1->shout();
    anim2->shout();
    //delete 对象
    ...
}

编译期多态的说明示例:

class Animal
{
public :
    void shout() { cout << "发出动物的叫声" << endl; };
};
class Dog
{
public:
     void shout(){ cout << "汪汪!"<<endl; }
};
class Cat
{
public:
     void shout(){ cout << "喵喵~"<<endl; }
};
template <typename T>
void  animalShout(T & t)
{
    t.shout();//在编译期间,编译器推断出模板参数,因此确定调用的shout是哪个具体类型的接口。--编译期多态
}
int main()
{
    Animal anim;
    Dog dog;
    Cat cat;
    animalShout(anim);
    animalShout(dog);
    animalShout(cat);
}

显式接口(class)和隐式接口(template)

组成什么时候完成检查
显式接口函数的签名式(函数名称,参数类型、返回类型)
隐式接口有效表达式

显式接口的说明示例:

class widget{
public:
    widget();
    virtual ~widget();
    virtual std::size_t size() const;
    void swap(widget& other);
};
//其public接口由一个构造函数、一个析构函数、size函数、swap函数及其参数类型、返回类型、常量性构成。也包括编译器产生的copy函数(copy构造函数和copy assignment操作符)

隐式接口的说明示例:

template<typename T>
void dofun(T& w)
{
    if(w.size() > 10 && w != value){...}
}
//T必须支持size成员函数,然而这个函数也可能从base class继承。这个成员函数不需返回一个整数值,甚至不需返回一个数值类型。就此而言,甚至不需要返回一个定义有operator>的类型!唯一需要的是返回一个类型为X的对象,X对象加上int必须能调用一个operator>。
//同样的道理,T并不需要支持operator!=,因为operator!=接受一个类型为X的对象和一个类型为Y的对象,T可被转换为X而value的类型可被转换为Y,这样就可以有效调用operator!=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值