美文网首页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
}

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

相关文章

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

    这篇文章要写的是c++的继承机制。 c++的类里面的三种函数,第一种是pure virtual function(...

  • 找不到工作的人还在学习(c++4)

    继承与接口 整个c++程序设计全面围绕面向对象的方式进行。类的继承特性是c++的一个非常重要的机制。继承特性可以使...

  • 清华毕业扫地僧,深入讲解Java基础+高级进阶300集,总计15

    前言 Java继承了C++语言面向对象技术的核心,又舍弃了C++语言中的指针、运算符重载以及多重继承的特性,同时引...

  • JS-Object 对象原型

    通过原型这种机制,JavaScript中的对象从其他对象继承功能特性,这种继承机制与经典的面向对象编程语言的继承机...

  • C到C++的升级

    1、C++ C++继承了所有的C特性 C++在C的基础上提供了更多的语法和特性 C++的设计目标是运行效率与开发效...

  • OC实现多继承的方法

    不同于C++拥有强大的多继承特性,OC 只支持单继承,但是OC真的就放弃了如此强大的多继承特性了么?答案是否定的。...

  • 如何使用c语言函数指针和结构体实现动态绑定

    我们思考C++的时候,往往关注它的面向对象特性,封装继承多态,实际上在更广泛的内涵下,面向对象的核心在于消息传递,...

  • C与C++的升级关系

    C++继承了所有的C特性 C++在C的基础上提供了更多的语法和特性 C++的设计目标是运行效率与开发效率的统一 升...

  • 2020-02-17-C++虚继承机制

    C++ 中出现多继承,当多继承就会出现 两个父类的复制,这样就出现了虚继承机制。 A 继承 ZB继承 ZC 继承 ...

  • C++ 类的封装继承多态

    C++ 特性 C++ 三大特性,封装继承多态。我们先实现一个Quote作为基类 net_price是一个虚函数,实...

网友评论

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

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

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