美文网首页
C/C++基础知识(四)——继承、多态和虚函数

C/C++基础知识(四)——继承、多态和虚函数

作者: 王志强_9380 | 来源:发表于2019-10-12 17:11 被阅读0次

c++中的继承使用冒号(:),可以指定继承方式(private,protect,public),支持继承多个父类,要访问父类的同名函数,使用 父类::函数 的形式
看个例子:

#pragma once
#include <iostream>
using namespace std;
class parent1 
{
private:
    void test1() {}
public :
    void test000() {
        cout << "parent1" << endl;
    }
    void test2() {}
};

class parent2
{
private:
    void test3() {}
public:
    void test111() {
        cout << "parent2" << endl;
    }
    void test4() {}

};

class child1:private parent1, public parent2
{
public:
    void test000() {
        cout << "child" << endl;
        parent1::test000();
    }
    void test111() {
        cout << "child" << endl;
    }
private:
    void testRange() {
        cout << "testRange" << endl;
    }

};

先测试下怎么调用父类方法:

child1 cd1;
cd1.test000();

结果:
child
parent1

再来看一下继承方式:


继承作用域.png
继承作用域.png

我们看以看到,在之类中调用父类的方法,和继承的方式无关,只和父类方法的作用域有关。如果是通过子类调用父类中的方法,看到例子中,cd1.test2()无法调用了,因为parent1的继承方式是private。
也就是说,如果是私有继承的话。父类中的公有(public)方法都被改为private了。外部是无法再访问的。对子类内部调用无影响

接下来看虚函数
我们修改一下调用方法


child转parent1.png

我们看到子类不能强转为私有继承的父类
我们改成公有继承的parent2

parent2* cd2 = new child1();
cd2->test111();

测试结果:
parent2

我们看到,调用的是parent2中的test111方法,这个和java中是不一样的。调用哪个方法和类的类型有关,试一下调用test000


调用test000.png

可以看到,调用不了test000,因为parent2中没有这个方法。

如果要在调用test111的时候,调用子类中的test111,应该怎么做呢?这里就需要使用虚函数 virtual,我们把parent2中test11改为虚函数

virtual void test111() {
    cout << "parent2" << endl;
}

执行结果
child

不使用虚函数的称为静态多态
使用虚函数的称为动态多态

可以看到,调用的是子类中的test111.如果想要实现java中abstract效果,可以使用纯虚函数,如下

virtual void test222() = 0;
纯虚函数.png

可以看到,子类必须去实现这个方法,否则会报错

注意:
构造方法不能声明为虚函数,会报错
析构方法一般声明为虚函数,因为释放资源一般是在子类中

相关文章

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • 深入研究C++多态(虚函数和虚继承)

    面向对象的三大特性是封装、继承和多态。多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C...

  • 2020-07-06----《C++类的学习》

    函数重载:同名不同参。 C++类的特点:封装、继承、多态。 //多态与函数重载是啥关系? 虚函数:和软件架构相关 ...

  • C++语言-多态,纯虚函数,模版函数

    1、虚函数、纯虚函数 需要注意的是,纯虚函数子类是必须继承的,虚函数不是不必须继承的。 2、多态 在C++中默认关...

  • 虚继承和虚函数

    虚继承和虚函数 虚继承和虚函数是毫不相关的两个概念,但是在实现上又有所类似;虚函数是C++中实现多态的一个重要手段...

  • C/C++基础知识(四)——继承、多态和虚函数

    c++中的继承使用冒号(:),可以指定继承方式(private,protect,public),支持继承多个父类,...

  • 查漏补缺

    C++虚函数: 多态: 静态多态(重载)、动态多态(虚函数) 虚函数 虚函数表:编译器为每个类创建了一个虚函数表...

  • C/C++面试题库:这些问题你回答得出来吗

    基础部分 1.1. 语言 一、 C和C++的特点与区别? 二、 阐述C++的多态 三、 阐释c++虚函数的实现 四...

  • 面试题目收集总结

    C++: 多态: 多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) c语言和c++有什么区别?(...

  • 02汇编角度理解虚函数的实现

    面向对象语言的三大特性 封装继承和多态。c++ 中的多态是通过虚函数实现的。我们声明一个Person类,然后 编写...

网友评论

      本文标题:C/C++基础知识(四)——继承、多态和虚函数

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