首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在没有基类但有指针的情况下,我如何重写虚方法?

在没有基类但有指针的情况下,重写虚方法可以通过以下步骤实现:

  1. 创建一个新的类,并定义一个与基类中虚方法相同的方法签名。
  2. 将该方法标记为虚方法,以便在派生类中进行重写。
  3. 在派生类中重写该方法,实现自定义的逻辑。
  4. 使用指针来引用派生类对象,并调用重写的虚方法。

下面是一个示例代码:

代码语言:txt
复制
#include <iostream>

class Base {
public:
    virtual void virtualMethod() {
        std::cout << "Base::virtualMethod()" << std::endl;
    }
};

class Derived : public Base {
public:
    virtual void virtualMethod() override {
        std::cout << "Derived::virtualMethod()" << std::endl;
    }
};

int main() {
    Derived derived;
    Base* basePtr = &derived;
    basePtr->virtualMethod(); // 输出 "Derived::virtualMethod()"

    return 0;
}

在上述示例中,我们创建了一个基类 Base,其中定义了一个虚方法 virtualMethod()。然后,我们创建了一个派生类 Derived,并在派生类中重写了 virtualMethod() 方法。在 main() 函数中,我们使用基类指针 basePtr 引用派生类对象,并调用了重写的虚方法。运行程序后,将输出 "Derived::virtualMethod()",证明成功重写了虚方法。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各类业务需求。产品介绍链接
  • 腾讯云云数据库 MySQL 版:高性能、可扩展的关系型数据库服务。产品介绍链接
  • 腾讯云云原生容器服务 TKE:基于 Kubernetes 的高性能容器服务,提供弹性、安全的容器化应用管理。产品介绍链接
  • 腾讯云人工智能平台 AI Lab:提供丰富的人工智能开发工具和服务,助力开发者构建智能化应用。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供全面的物联网解决方案,帮助连接和管理物联网设备。产品介绍链接
  • 腾讯云移动应用分析(MTA):提供全面的移动应用数据分析服务,帮助开发者洞察用户行为和应用性能。产品介绍链接
  • 腾讯云对象存储(COS):安全、稳定、低成本的云端存储服务,适用于各类数据存储需求。产品介绍链接
  • 腾讯云区块链服务(BCS):提供一站式区块链解决方案,帮助企业快速搭建和部署区块链网络。产品介绍链接
  • 腾讯云游戏多媒体引擎(GME):提供高品质的游戏音视频通信服务,支持实时语音、语音识别等功能。产品介绍链接
  • 腾讯云视频处理(VOD):提供全面的视频处理服务,包括转码、截图、水印等功能,助力视频应用开发。产品介绍链接

请注意,以上链接仅为示例,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++【多态】

,如果是函数且三同,则为重写;若不是函数且函数名相同,则为重定义 注:中,仅仅是函数名相关(未构成重写情况下),就能触发 重定义(隐藏) ---- 3、抽象 什么是抽象?...,可以看到涉及函数对象中都有属性 __vfptr(指针),可以通过指针所指向地址,找到对应函数表中存储函数指针,可以调用函数时根据不同地址调用不同方法 在下面这段代码中...,当父指针面临 不同表中相同函数重写 时,该如何处理呢?...( ) A:一个只能有一张表 B:中有函数,如果子类中没有重写函数,此时子类与共用同一张表 C:表是在运行期间动态生成 D:一个不同对象共享该类表 4.下面程序输出结果是什么...,不被重写情况下,构成重定义,父类同名函数被隐藏 重载可以出现任何位置,只要函数同一作用域中,而重定义是重写基础,或者是重写包含重定义,假设因为没有 virtual 修饰不构成重写,那么必然构成重定义

11130

【C++】多态

注意⚠: 重写函数时,派生函数不加virtual关键字,也可以构成重写(可以认为继承后函数被继承下来了派生中依旧保持函数属性),但是该种写法不是很规范,不建议这样使用 但是父...另外还可以是指针去调用: 我们说必须是指针或者引用去调用函数,那就意味着用对象是不行: 虽然没有报错,但是并没有实现多态。...,这种情况下是不是没有构成多态啊。 因此此时test是只属于B,所以testthis指针是B*,这次是子类指针去调用func,所以没有构成多态。...override:检查派生是否对函数进行了重写,如果没有重写编译报错。 这里是重写,所以没报错。...它定义了一组方法和行为,但并没有具体实现细节。你可以把它看作是一个规范,告诉其他应该有哪些方法,并且如何使用这些方法

9010

浅谈C++多态性

(这里认为要补充,重写的话能够有两种,直接重写成员函数和重写函数,仅仅有重写函数才干算作是体现了C++多态性)而重载则是同意有多个同名函数,而这些函数參数列表不同,同意參数个数不同,參数类型不同...假设没有使用函数的话,即没有利用C++多态性,则利用指针调用对应函数时候,将总被限制函数本身,而无法调用到子类中被重写函数。...并非非常理解这样使用方法,从原理上来解释,因为B是子类指针,尽管被赋予了对象地址,可是ptr->foo()调用时候,因为地址偏移量固定,偏移量是子类对象偏移量,于是即使指向了一个对象情况下...C++纯函数 一、定义 纯函数是中声明函数,它在中未定义,但要求不论什么派生都要定义自己实现方法。...2、非常多情况下本身生成对象是不合情理。比如,动物作为一个能够派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

35810

C++多态

一个含有函数中至少都有一个函数表指针,且有一个表,函数指针指向函数表。表可以继承,如果子类没有重写函数,那么子类表中仍然会有该函数地址,只不过这个地址指向函数实现。...函数作用主要是实现了多态机制,定义函数,子类可以重写该函数;派生中对定义函数进行重写时,需要在派生中声明该方法方法,否则将会形成覆盖。...如果派生重写方法,该派生函数表将保存重写函数地址,而不是函数地址。...如果方法没有派生重写,那么派生将继承方法,而且派生函数表将保存中未被重写函数地址。...表中最后一个点表示函数结束标志 一般继承情况下函数按照其声明顺序放于表中,且父函数子类函数前面。

1.7K10

三大特性之多态

函数重写也可以被称为函数覆盖,因为带有函数都有一个函数表,继承时候子类会继承父函数表,如果子类对某一个函数进行重写了,那么该函数子类函数表中就会被重写函数覆盖。...重写两个例外 1.协变 子类对于父函数重写,返回类型可以不同,但必须要是返回父子类关系指针或引用(即函数返回对象指针或者引用,派生函数返回派生对象指针或者引用),称为协变 class...如果定义了一个子类对象,并将该子类对象赋值给一个父指针,当我释放父时候只会调用父析构函数,也就是说只释放了子类中父那一部分资源,而没有释放子类资源,这就可能会导致内存泄漏。...如果将析构函数定义为函数并重写,那么释放父指针时候,调用是子类析构函数,子类析构函数对于父那一部分资源通过父析构函数清理,同时也会清理自己资源。...子类不但有从父继承下来成员,还有子类自己特有的成员,也就是说子类除了有重写函数还有自己特有的函数。

16320

C++:深入理解多态

1. final:修饰函数,表示该函数不能再被重写(实际上这样应用场景很少,因为我们建立函数目的基本上都是为了重写) 2. override: 检查派生函数是否重写某个函数,如果没有重写编译报错...,而没有重写就失去了意义,最好方法其实是让编译器对没重写函数进行报错,但是之前在这方面没有去严格地限制说不重写就会报错,所以这边做了一个妥协就是你可以通过增加override来帮助你检查,防止你写漏...纯函数规范了派生必须重写,另外纯函数更体现出了接口继承。 在生活中一个类型现实中没有对应实体,我们就可以一个定义为抽象!...: 1、函数表(简称表)本质上是一个函数指针数组 2、子类创建对象时候会拷贝父函数表,然后如果没有发生重写(比如Func()) 那函数表存就是父函数,如果发生了重写(比如BuyTicket...总结一下派生表生成过程: a.先将表内容拷贝一份到派生表中 b.如果派生重写中某个函数,用派生自己函数覆盖表中函数 c.派生自己新增加函数按其派生声明次序增加到派生最后

5800

【c++】全面理解C++多态:函数表深度剖析与实践应用

Person对象买票全价,Student对象买票半价 那么继承中要构成多态还有两个条件: 必须通过指针或者引用调用函数 被调用函数必须是函数,且派生必须对函数进行重写 指向谁调用谁...和 final C++对函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有程序运行时没有得到预期结果才来debug会得不偿失...,它只有重写func1和继承func2,没有func3,func4,这里是监视窗口问题 Derive 表中,会有以下指向函数指针: 指向 Derive::func1 指针重写了...调用就可以看出存是哪个函数 函数写好后,关键是如何取到它地址?...然而,继承情况下,共享该例子中是 A)只会被初始化一次,而且是由最底层派生(D)来初始化。

11100

【C++】从零开始认识多态

多态构成条件: 必须通过指针或者引用调用函数(virtual修饰成员函数) 被调用函数必须是函数,且派生必须对函数进行重写(父子虚函数要求三同) 函数重写(覆盖):派生中有一个跟完全相同函数...协变:派生重写函数时,与函数返回值类型不同: 函数返回对象指针或者引用 派生函数返回派生对象指针或者引用 这样情况称为协变。...virtual void func() final { } override: 检查派生函数是否重写某个函数,如果没有重写编译报错。...override关键字区别: 抽象间接强制了派生必须进行函数重写 override是已经重写情况下,帮助进行重写语法检查 6 多继承中多态 多继承我们讲过,是一种很危险继承,很容易导致菱形继承...那么我们再来看看多态多继承中是然如何实现

7110

【C++】多态

那么继承中要构成多态还有两个条件: 1. 必须通过指针或者引用调用函数 2....被调用函数必须是函数,且派生必须对函数进行重写 二.函数 2.1函数概念 继承中我们讲到派生可以继承其成员,然而在遇到如上图BuyTicket这样与类型相关操作时派生必须对其完成重新定义...必须要搞清楚一点是,动态绑定只有当我们通过指针或引用调用函数时才会发生。 2.4回避函数机制 某些情况下,我们希望对函数调用不要进行动态绑定,而是强迫其执行函数某个特定版本。...override: 检查派生函数是否重写某个函数,如果没有重写编译报错。...总结一下派生表生成:a.先将表内容拷贝一份到派生表中 b.如果派生 重写中某个函数,用派生自己函数覆盖表中函数 c.派生自己 新增加函数按其派生声明次序增加到派生最后

11510

C++:44---关键字virtual、override、final

virtual函数 函数子类和父访问权限可以不同 相关规则: ①如果函数返回值类型是基本数据类型:返回值类型必须相同 ②如果函数返回值类型是本身指针或引用:返回值类型可以不同,但派生返回值类型小于返回值类型...三、覆盖(重写) 概念:函数,如果派生有相同函数,则子类方法覆盖了父方法 覆盖(重写)与隐藏关系: 覆盖与隐藏都是子类出现与父相同函数名,但是有很多不同 隐藏可以适用于成员变量和函数...如果类方法外进行定义,那么override不能加 不一定强制要求子类声明这个关键字,但是建议使用(见下面的五) 这是C++11标准填入 override设计最初原因: 有些情况下,我们定义了一个函数...,但是子类没有覆盖(重写)这个函数,而子类中却出现了一个与函数名相同、但是参数不同函数,这仍是合法。...“函数”时才会发生,如果通过对象进行函数调用,那么在编译阶段就确定该调用哪个版本函数了(见下面的演示案例) 当然,如果派生没有重写函数,那么通过指针指向于派生时,调用函数还是调用函数

3.7K31

【C++】多态

满足多态调用,首先调用函数必须是重写函数(如果函数只是简单继承到父,父没有显示写出来函数,则这样也不能算是重写函数,不符合多态,具体细节放到多态原理部分讲解),更为重要是必须是指针或者引用调用重写函数...有很多文章都说g++平台下指针存在.rodata段,但也没人能够验证这个结论,老师告诉g++指针也是存在于代码段里面的,个人也这么觉得,下面第一张图片便是程序g++下运行结果,可以看到位置和代码段非常接近...我们也有两种解决办法,一种就是类型转换时将对象地址强制类型转换为二级指针,这样解引用时候,拿到就是一级指针,一级指针大小32位和64位平台是不同值,那么再将指针转换为函数地址类型就可以了...重写指的是继承体系中,派生继承函数,并且函数函数名参数列表返回值均与相同,重写函数实现,这样函数就称之为重写。...这里需要分情况,如果是普通调用,则函数和普通函数并没有任何区别,因为即使你函数重写了,但如果调用指针或引用并非类型,那么你还是和普通函数没有区别,并不会去表里面找函数,而是直接静态绑定,在编译后符号表里面就确定了调用函数地址

50720

C++之多态

继承种构成多态要满足两个条件: 必须通过指针或者引用调用函数(该指针或者引用操作是派生那一部分内容) 被调用函数必须是函数,且派生必须对函数进行重写。...和final关键字 C++对函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重写,而这种错误在编译期间是不会报出,只有程序运行时没有得到预期结果才来debug会得不偿失...final修饰父函数,该函数不能被重写; override修饰子类函数检查是否完成重写,如果没有完成重写则会编译报错。...总结一下派生形成: 函数直接进派生表; 函数如果在派生中被重写,就将重写函数覆盖函数; 派生自己函数,按照其派生中声明顺序依次增加在最后;...我们可以将这个现象理解为一个Bug,并不是派生表里没有它自己函数,而是这两个函数被监视窗口隐藏了。那么如果我们想查看派生函数都有那些该如何进行查看呢?

33340

【C++】继承和多态高频面试题整理

关于表说法正确是( ) A:一个只能有一张表 B:中有函数,如果子类中没有重写函数,此时子类与共用同一张表 C:表是在运行期间动态生成 D:一个不同对象共享该类表...答案:D 假设A中有函数,B继承自A,B重写A中函数,也没有定义任何函数,则( ) A:A对象前4个字节存储表地址,B对象前4个字节不是表地址 B:A对象和B对象前4个字节存储都是地址...2.6 构造函数可以是函数吗? 答: 不能,因为对象中函数表指针构造函数初始化列表阶段才初始化。 2.7 析构函数可以是函数吗?什么场景下析构函数要搞成函数?...我们可能会觉得调普通函数快,因为调普通函数不需要像调函数那样还得通过指针函数表里面找。 但是呢,这样说不准确,问大家,调用函数一定要去表里面找吗?...2.9 函数表是什么阶段生成,存在哪? 这个在上一篇文章也详细介绍过了。 2.10 C++菱形继承问题?继承原理? 2.11 什么是抽象?抽象作用?

16910

C++-带你走进多态(1)

必须通过指针或者引用调用函数 2....被调用函数必须是函数,且派生必须对函数进行重写  BuyTicker就是函数,要构成多态就必须完成函数重写,而且必须通过指针或者引用调用这个函数。  ...协变(与派生函数返回值类型不同) 派生重写函数时,与函数返回值类型不同。即函数返回对象指针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...如果使用指针指向一个派生,就会出现内存泄漏情况,因为派生析构函数并没有调用。解决方法就是让派生析构函数完成重写。...2.4 C++11 override 和 final C++对函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有程序运行时没有得到预期结果才来

5210

C++|对象模型|对象模型综述

此外,由于部分字段只多重继承或继承情况下有用,不同情况下,指向成员函数指针可以有着不同实例,VC++提供了 单一继承实例(vcall thunk or faddr) 多重继承实例(vcall thunk...一个古老实现方法是,每一个派生对象中存放一个指针而非传统对象模型中对象本身,对访问通过指针间接实现,以此实现共享。...然而,这种实现方法有很多缺陷: 对象为每个背负一个额外指针,而理想上空间负担应该不随数目变化。 虚拟继承链延伸导致间接层增加,而理想上时间负担应该不随虚拟派生深度变化。...为语法苦恼应该是C++编译器作者,而不是程序员。 一般而言,为了避免上述困扰,推荐方法是面向接口(类型)编程,即一个没有data member。...而在指针调用派生重写函数时,则需要反过来调整this指针(由编译器插入或者thunk引入),从而正确指向对应表。

63110

C++纯函数 virtual =0

什么情况下使用纯函数(pure vitrual function)?...如果不在派生中实现在Show方法编译都不会让你通过。...但是随着各类C++书越来越多,后来程序员也许不会再犯犯过错误了。但是打算澄清一下: override是指派生重写函数,就象我们前面B重写了Afoo()函数。...纯析构函数并没有什么作用,是就够了。通常只有希望将一个变成抽象(不能实例化),而这个没有合适函数可以被纯虚化时候,可以使用纯析构函数来达到目的。...从设计角度讲,出现在函数是接口,出现在派生函数是接口具体实现。通过这样方法,就可以将对象行为抽象化。

1.5K40

【ES三周年】C++多态

1.4如何实现一个不能被继承 方法一:是需要把它构造函数写为私有即可,无法构造,就不可能被继承; 方法二:定义时,加final(c++11),最终,不能被继承 class A final{}...多态实现两个条件: 1.必须使用父指针或者引用调用函数; 2.被调用函数必须是函数,且子类(派生)必须对函数进行重写; 多态是不同继承关系对象,去调用同一函数,产生了不同行为...函数继承是一种接口继承,派生继承函数接口,目的是为了重写,达成 多态,继承是接口。...不能,因为静态成员函数没有this指针,静态成员函数没有实例化对象之前就已经分配空间了,不用实例化对象也可以调用,但是 对于 virtual 函数,它调用恰恰使用this指针。...注意这里不要把函数表和表搞混了: 菱形继承为了避免数据冗余,会用表来解决,表是用来存偏移量,进而通过偏移量来找到继承是函数重写,通过指针找到表,进而调用表中函数

383100

【C++】非常重要——多态

1.4如何实现一个不能被继承 方法一:是需要把它构造函数写为私有即可,无法构造,就不可能被继承; 方法二:定义时,加final(c++11),最终,不能被继承 class A final {...多态实现两个条件: 1.必须使用父指针或者引用调用函数; 2.被调用函数必须是函数,且子类(派生)必须对函数进行重写; 多态是不同继承关系对象,去调用同一函数,产生了不同行为...函数继承是一种接口继承,派生继承函数接口,目的是为了重写,达成 多态,继承是接口。...不能,因为静态成员函数没有this指针,静态成员函数没有实例化对象之前就已经分配空间了,不用实例化对象也可以调用,但是 对于 virtual 函数,它调用恰恰使用this指针。...注意这里不要把函数表和表搞混了: 菱形继承为了避免数据冗余,会用表来解决,表是用来存偏移量,进而通过偏移量来找到继承是函数重写,通过指针找到表,进而调用表中函数

32930

多态与(函数)表

那么继承中要构成多态还有两个条件: 必须通过指针或者引用调用函数 被调用函数必须是函数,且派生必须对函数进行重写 1. 2️⃣函数 函数:即被virtual修饰成员函数称为函数...,派生函数不加virtual关键字时,虽然也可以构成重写(因 为继承后函数被继承下来了派生依旧保持函数属性),但是该种写法不是很规范,不建议 这样使用*/ /*void BuyTicket...协变(与派生函数返回值类型不同) 派生重写函数时,与函数返回值类型不同。即函数返回对象指 针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有程序运行时没有 得到预期结果才来debug会得不偿失,因此:C++11提供了override...总结一下派生表生成:a.先将表内容拷贝一份到派生表中 b.如果派生重写中某个函数,用派生自己函数覆盖表中函数 c.派生自己新增加函数按其派生声明次序增加到派生最后

56020

【C++】多态——实现、重写、抽象、多态原理

: 必须通过指针或者引用调用函数 被调用函数必须是函数,且派生必须对函数进行重写 这两个条件我们来仔细看一看: 函数:即被virtual修饰成员函数称为函数...继续往下看把 而通过指针是符合多态条件: 注意: 1.子类函数可以不加virtual 重写函数时,派生函数不加virtual关键字时,虽然也可以构成重写(因为继承后函数被继承下来了派生依旧保持函数属性...总结一下派生表生成:先将表内容拷贝一份到派生表中,如果派生重写中某个函数,用派生自己函数覆盖表中函数,派生自己新增加函数按其派生声明次序增加到派生最后...我们来打印出来: 此时func3()就找到了,所以多继承派生重写函数放在第一个继承部分函数表中。另一个表有没有func3()呢?...函数表是在编译阶段就生成构造函数初始化列表中初始化指针,一般情况下存在代码段(常量区)。 6.不要把函数表和表搞混了:多态中,函数表是存放函数地址。

37430
领券