item34: 区分接口继承和实现继承

来源:互联网 发布:只知魏晋 编辑:程序博客网 时间:2024/05/22 06:19

很明显基类的成员函数有三种类型,决定了它们在继承类中扮演什么角色。

我们这里只针对public继承,因此讨论的范围也只限于public/protected成员函数。

首先是纯虚函数,它表示对继承类提供接口。

其实是非纯的虚函数,它表示在提供接口的基础上还提供了一份默认的实现。这里可能会有一些陷阱。倘若你有这样的一个需求,你既要提供一个默认的实现,又想强烈的提醒继承类,你最好overide这个虚函数,你可以在基类的虚函数里这么做:

class Base{public:    virtual void mf1() {mf2();}protected:    void mf2() { do_sth(); }};

让人有点意外的是,你还可以给纯虚函数提供一个实现,这不会破坏这个抽象类的属性,你仍然无法直接定义一个基类对象,但是你的继承类对象却真的可以调用那个基类的纯虚函数!

class Base{public:    virtual void mf1() =0 {mf2();}};classs Derived : Base {};Derived d; // okBase b; // errord.mf1(); // ok!!!

最后是非虚函数,它表示这些函数继承类可以原封不动的拿来使用。

0 0
原创粉丝点击