首页 > 编程语言 >C++继承

C++继承

时间:2024-05-14 23:42:02浏览次数:9  
标签:函数 继承 子类 void C++ virtual 父类 public

继承

通过继承机制可以实现对代码的拓展以及重用,而不用通过复制粘贴的方式来实现重用

继承语法:Class B : public A{ ... }; public是公用继承用的最多,B是子类(派生类),A是父类(基类)

子类可以访问从父类被public修饰的成员变量和函数,以及一些新增加的函数和变量,子类不能直接访问父类的private修饰的成员。

虚函数:在类中声明成员函数为虚函数,是为了便于子类对父类函数的override(重写)

虚函数工作原理:通常编译器处理虚函数:给每个对象添加一个隐藏成员(vptr),隐藏成员(vptr)是一个指向函数地址数组的指针,这种数组成为虚函数表(virtual function table, vtbl)。虚函数表中存放的是为类对象进行声明的虚函数的地址。用《C++ Primer Plus》书中的例子来说明虚函数工作原理:

Physicist adam("Adam Crusher", "nuclear structre");
Scientist * psc = &adam;	//这里发生的是upcasting向上造型
psc->show_all();

psc->show_all()执行过程:

  1. 通过psc->vptr找到Physicist对象vptr中的值2096
  2. 通过地址2096找到对应的虚函数表
  3. 在表中寻找Physicist::show_all地址6820
  4. 跳转到地址6820去执行相应的函数

多态(Polymorphic):方法的行为取决于调用该方法的对象,同一个方法的行为随上下文而异。

实现多态的两种机制:

  • 父类函数添加virtual关键字
  • 子类中重写父类被virtual修饰的函数

纯虚函数(pure virtual functions):父类只有虚函数的声明,父类不能实例化,此时父类像是一个接口(interface),强制子类实现虚函数

举个例子:

声明一个抽象类Creature,让Animal类继承并实现其中的纯虚函数,Dog类再继承Animal类并重写play(),将Dog类对象、Animal类对象作为参数传递给void showPlay(Creature& c),会根据参数的类型选择其对应的函数。继承关系图:

#include <iostream>
using namespace std;

/******抽象类*******/
class Creature
{
public:
    virtual void sleep() = 0;   //pure virtual function
    virtual void eat() = 0;     //pure virtual function
    virtual void play() = 0;
};

/****************/

class Animal : public Creature
{
public:
    void sleep() { cout << "Animal is sleeping...\n"; }  
    void eat()  { cout << "Animal is eatting...\n"; }     
    virtual void play() { cout << "Animal is playing...\n"; }
};

class Dog : public Animal
{
private:
    double weight;
public:
    virtual void play() { cout << "Dog is playing...\n"; }	//重写父类的play(),C++11增加override关键字,增加可读性
    //也可以这么写:
    //virtual void play() override { cout << "Dog is playing...\n"; }
};

void showPlay(Creature& c)
{
    c.play();
}

int main()
{
    //Creature c; //报错,抽象类不能实例化
    Animal a;
    Dog d;
    showPlay(a);    //call Animal::play()
    showPlay(d);	//call Dog::play()

    return 0;
}

标签:函数,继承,子类,void,C++,virtual,父类,public
From: https://www.cnblogs.com/qianxiaohan/p/18192510

相关文章

  • 【VsCode输出中文乱码问题】用vscode写c/c++时,终端输出结果为中文乱码如何解决?
    前言因为我平时在vscode写代码,在输出语句时,不会出现中文,所以之前一直没有遇到这个问题。但是今天,在练习的时候,涉及到了中文输出,所以遇到了这个中文乱码问题。我在运行代码时,发现代码页面上的中文正常显示,而终端输出的中文却是乱码其实,出现中文乱码是非常常见的事了,比如在浏览......
  • 【编译原理】根据给定文法,用C/C++语言编写Translation Schema,执行程序并给出结果
    任务描述本关任务:根据给定文法,用C/C++语言编写TranslationSchema,执行程序并给出结果相关知识为了完成本关任务,你需要掌握:TranslationSchema相关方法理论C/C++编程语言基础C语言的基本结构知识TranslationSchema在动手设计之前,你应该先做好TranslationSchema的相关......
  • [19] C++网络通信开发
    Day1 通过引入路径找到类型根据角色进入方向开门(向量运算、几何概念、点乘)向量的减法:OtherActor->GetActorLocation()-GetActorLocation()这一部分是计算两个位置向量之间的差向量,即门的位置向量减去角色的位置向量,得到了一个从门指向角色的向量。向量的归一化:V1......
  • golang进程通过共享内存和C++进程进行通信
    目录serverclientserverC++可以使用POSIX共享内存API来创建和管理共享内存server.cpp#include<fcntl.h>#include<sys/mman.h>#include<sys/stat.h>#include<unistd.h>#include<cstring>#include<iostream>constchar*S......
  • c++ union
    在C++中,`union`是一种特殊的数据结构,它允许在同一内存空间中存储不同类型的数据。`union`允许您定义一个变量,但这个变量可以存储多种不同类型的值,而不是只能存储一种类型的值。在任何给定时间,`union`中只有一个成员可以有值,所有其他成员都将保持未定义的状态。`union`的声......
  • c++ true_type与false_type
    std::true_type和std::false_type实际上是类型别名是两个类型(类模板)注意区分true_type与false_type与true和false区别true_type,false_type代表类型true,false代表值nmsp1::FalseTypemyfunc1();//返回假这种含义nmsp1::TrueTypemyfunc2();//返回真这种含......
  • c++-----declval
    std::declval基本概念和常规实例std::decval–C++新标准中出现的函数模板,没有函数体(只有声明、没有实现),无法调用,一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等查看源码: add_rvalue_reference:是C++标准库中的类模板,他的能力是给进一个类型,它......
  • C++:private继承
    平时我们使用类继承是这个画风:classchild:public::father{};表示子类child继承父类father,这里有个关键词"public",表示继承到的父类属性和方法为自己的public成员,这种情况下子类的对象或者说实例化是可以直接访问这些成员的 当改成classchild:private::father{};则......
  • c++踩方格-动态规划基础题
    有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;b、走过的格子立即塌陷无法再走第二次;c、只能向北、东、西三个方向走;请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同......
  • C++类型转换
    一、整形提升整型提升是一种隐式类型转换,当涉及到小于int类型的整数(如char、short、bool等)时。整型提升的目的是确保所有的操作数在算术运算或比较操作中具有相同的类型,通常是int类型,如果int不能表示该值,则可能会提升到unsignedint或更大的整数类型。二、无符号数和带符号数进......