美文网首页C/C++编程语言爱好者C++
C++的核心特性:继承机制

C++的核心特性:继承机制

作者: DayDayUpppppp | 来源:发表于2017-04-26 11:24 被阅读435次

    这篇文章要写的是c++的继承机制。

    c++的类里面的三种函数,第一种是pure virtual function(纯虚函数),第二种是virtual function(虚函数),第三种是non-virtual function(非虚函数)。在设计一个类的时候,(尤其是基类的时候)要考虑设计的函数,要写成什么类型。

    纯虚函数:派生类只继承接口
    虚函数:派生类可以继承接口和一个默认的实现
    非虚函数:派生类继承基类的一个强制的实现
    (from 《effective c++》)

    下面分别举几个例子:

    • 纯虚函数:
    class Base_PureVirtualFunction {
    public :
        virtual void print() = 0;
    };
    
    class Derived_PureVirtualFunction:public Base_PureVirtualFunction {public:
        void print() {
            cout << "derived " << endl;
        }
    };
    
    int main() {
        //Base_PureVirtualFunction b;//  错误,没有办法创建含有纯虚函数的对象,因为纯虚函数没有相应的实现
        Derived_PureVirtualFunction d;
        d.print()
        return 0;
    }
    

    纯虚函数的作用是 只希望派生类继承基类的接口,然后去根据派生类的情况,去给他一个实现。

    • 虚函数
    
    class Base_VirtualFunction {
    public:
        virtual void print() {
            cout << "base" << endl;
        }
    };
    
    class Drived_VirtualFunction:public Base_VirtualFunction {
    public:
        void print() {
            cout << "derived" << endl;
        }
    };
    
    int main() {
        //demo2
        Base_VirtualFunction b;
        b.print();     //输出base
    
        Drived_VirtualFunction d;
        d.print();    //输出derived
    
        b = d;
        b.print();    //输出base
    
        // 关于虚函数的另外一个知识点,动态联编
        // 动态联编 只有指针和引用有效
        Base_VirtualFunction *b1 = &d;
        b1->print();    //输出derived
    
        Base_VirtualFunction &b2 = d;
        b2.print();     //输出derived
    
        system("pause");
        return 0;
    }
    

    虚函数的机制是,基类向派生类提供一个接口和默认的实现,派生类可以根据情况,自己定义符合自身的实现,也可以调用基类的默认的实现。这里还有关于虚函数的另外一个知识点,动态联编,重点不在这里,就不解释了。

    • 非虚函数
    class Base_NonVirtualFunction {
    public:
        void print() {
            cout << "non virtual function " << endl;
        }
    };
    
    class Drived_NonVirtualFunction :public Base_NonVirtualFunction {
    public :
        void other_print() {
            cout << "other " << endl;
        }
    };
    int main(){
        Base_NonVirtualFunction b;
        b.print();   //输出non virtual function
    
        Drived_NonVirtualFunction d;
        d.print();   // 输出non virtual function
        d.other_print();  //输出other
    }
    

    对于非虚函数:
    1 . 派生类其实继承了基类的所有函数的数据成员
    2 . 非虚函数的作用是基类给派生类的一个强制性实现的函数

    3 . 对于一个基类给派生类的一个强制性实现的函数,派生类也可以重新定义一个相同名字的函数,不过这样就是覆盖了。派生类的函数会覆盖掉基类的函数。

    一个新的例子:

    class Base_NonVirtualFunction {
    public:
        void print() {
            cout << "non virtual function " << endl;
        }
    };
    
    class Drived_NonVirtualFunction :public Base_NonVirtualFunction {
    public :
        void other_print() {
            cout << "other " << endl;
        }
           //和子类同名的函数
        void print() {
            cout << " derived" << endl;
        }
    };
    
    int main(){
        Base_NonVirtualFunction b;
        b.print();    //输出non virtual function
    
        Drived_NonVirtualFunction d;
        d.print();    //输出 derived
        d.other_print();   //输出 other
    }
    

    这里想强调的是,无论是自己在设计类的时候,还是在看别人的代码的时候,首先应该注意一下:
    它们分别是什么类型的函数(划重点)。因为不同的类型,代表的着不同的设计机制。

    相关文章

      网友评论

      • yia宁:第二个哪里有虚函数?
        DayDayUpppppp:谢谢提醒,是我自己写错了,已经修改
      • tangyaohua:lz你第二个例子不对吧,基类指针去调派生类,怎么还输出基类内容呢,虚函数表哪去了?
      • 吾芸:很有用 🤗🤗🤗🤗
      • loveSnowBest:发现简书关于c++这方面的东西还是太少了🤓

      本文标题:C++的核心特性:继承机制

      本文链接:https://www.haomeiwen.com/subject/kakizttx.html