首页 > 其他分享 >虚函数返回自己类型指针或引用,重写时返回类型可以不一样

虚函数返回自己类型指针或引用,重写时返回类型可以不一样

时间:2024-08-22 23:29:21浏览次数:6  
标签:返回 const getSelf Dog Animal 类型 include 重写 public

C++

#include <functional>
#include <iostream>
#include <vector>
#include <memory>
#include <set>
#include <map>
#include <string>

using namespace std;

namespace
{
    /*C++ 类不能继承它自己*/
    class Animal /*:public Aniaml*/
    {
    public:
        Animal(string n)
        {
            name = n;
        }
        virtual const Animal* getSelf()
        {
            return this;
        }
    public:
        string name;
    };

    class Dog :public Animal
    {
    public:
        Dog(string n, int a) :Animal(n)
        {
            age = a;
        }
        //const Animal* getSelf() override
        const Dog* getSelf() override
        {
            return this;
        }
    public:
        int age;
    };
}

#if 1

int main()
{
    Dog dog("小狗", 2);

    Animal* animal = &dog;
    const Animal* p_animal = animal->getSelf();
    // 这个只能访问到它自己类型的
    cout << "名字:" << p_animal->name << endl;

    const Dog* p_dog = dog.getSelf();
    cout << "名字:" << p_dog->name << endl;
    cout << "年龄:" << p_dog->age << endl;

    return 0;
}

#endif

虚函数 virtual const Animal* getSelf()在派生类可以返回const Dog* getSelf() override,这样就可以不用进行类型转换了。

C#

经测试,C# 好像不支持这种写法。C#9.0 支持这种协变返回类型?

标签:返回,const,getSelf,Dog,Animal,类型,include,重写,public
From: https://www.cnblogs.com/huvjie/p/18374938

相关文章

  • 第三章 redis数据类型
    redis数据类型redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。redis={"name":"yuan","scors":["100","89","78"],"info":{"name":"rain"......
  • 【redis数据库】基础入门,五种类型增删改查
    目录1.redis的启动2.redis基本操作3.redis的数据类型4.字符串操作添加修改值获取值5.键相关操作查找键判断键是否存在查看键对应的值类型设置已有键的过期时间查看键过期时间6.哈希操作添加值添加多个值获取字段获取字段对应的值获取多个字段的值获取所有字......
  • 全流程基于最新导则下的生态环境影响评价技术方法及图件制作(土地利用现状图的制作、植
    根据最新生态环境影响评价导则,结合生态环评内容庞杂、综合性强的特点,以既包括陆域、又包括水域的项目为主要案例,对生态环评的具体流程及所需内容进行系统阐述。利用Rstudio、Fragstats等软件分析计算生态环评中所需各种指数,利用ENVI、Maxent等软件分析制作生态环评中所需各种图......
  • C语言数据类型和变量(下)
    目录1.算数操作符:+、-、*、/、%1.1+和-1.2*5.3/5.4%2.赋值操作符:=和复合赋值2.1连续赋值6.2复合赋值符3.单目操作符:++、--、+、-3.1++和--3.1.1前置++3.1.2后置++3.1.3前置--3.1.4后置-- 3.2+和- 4.强制类型转换 5.scanf和prin......
  • 算法与数据结构——基本数据类型与编码
    基本数据类型基本数据类型是计算机CPU可以直接进行运算的类型,在算法中直接被使用,主要包括以下几种整数类型byte、short、int、long。浮点数类型float、double,用于表示小数字符类型char,用于表示各种语言的字母、标点符号甚至表情符号等。布尔类型bool,用于表示“是”与“否”......
  • C++ 中几种类型转换
    C++中常用的类型除了隐式转换,还有显示转换,如:static_cast,dynamic_cast,const_cast,reinterpret_cast。其中隐式转换如常见的double、int、bool、float等类型之间的转换。显示转换的用法具体如下:一、static_cast:静态转换使用条件:(1)用于不同类型之间的转换,相当于隐式转换......
  • 【C++】定义类型别名的三种方式及其优缺点:typedef,#define 和 using
    引言类型别名是一种给已存在的类型创建一个新名字的方式。这个新的名字(别名)和原类型在语义上是完全相等的,可以在任何原类型可以使用的地方使用。类型别名并不创建一个新的类型,只是为了提高代码的可读性和可维护性。在C++中,可以使用typedef,#define或者using来定义别名。每......
  • 关于Arrays.asList返回List无法新增和删除?
    关于Arrays.asList返回的List无法新增和删除?这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理复现代码示例:publicclassArraysAsList{publicstaticvoidmain(String[]args){Integer[]array={1,2,3,4,5};List<Integer>list=......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • MySQL 数据类型详解
    MySQL是一种广泛使用的关系型数据库管理系统,它支持多种数据类型以满足各种应用场景的需求。本文将详细介绍MySQL支持的数据类型、它们的使用场景以及实现原理,并通过图示帮助读者更直观地理解。目录简介数值类型整型浮点型定点型日期和时间类型字符串类型字符串二进制字......