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

有没有办法获得一个派生类的‘type in a base class’函数?

在面向对象编程中,派生类是从基类继承而来的子类。在C++中,可以通过使用虚函数和运行时类型识别(RTTI)来实现获取派生类的类型信息。

C++中的基类可以定义一个虚函数,用于返回对象的类型信息。派生类可以重写这个虚函数,返回自己的类型信息。这样,通过基类的指针或引用调用这个虚函数时,就可以获取到派生类的类型信息。

以下是一个示例代码:

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

class Base {
public:
    virtual const char* getType() const {
        return "Base";
    }
};

class Derived : public Base {
public:
    const char* getType() const override {
        return "Derived";
    }
};

int main() {
    Base* base = new Derived();
    std::cout << base->getType() << std::endl;  // 输出 "Derived"

    delete base;
    return 0;
}

在这个示例中,基类Base定义了一个虚函数getType(),返回字符串"Base"。派生类Derived重写了这个虚函数,返回字符串"Derived"。在main()函数中,通过基类指针调用getType()函数,输出的结果是"Derived",表明获取到了派生类的类型信息。

需要注意的是,这种方法只能在运行时获取到派生类的类型信息,而不能在编译时确定。此外,这个方法只适用于C++语言,其他编程语言可能有不同的实现方式。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出相关链接。但腾讯云提供了丰富的云计算服务,包括云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。

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

相关·内容

60秒问答:多态和函数重载关系?

目录:阅读该文章将获得如下收益 什么是多态,与重载,重写,隐藏什么关系?...答:隐藏分为2个情况,同名函数查找过程 派生类 基类 全局 情况1 如果是通过派生类访问一个函数派生类局部作用域隐藏上层 base同名函数。...为了让隐藏起来名字重见天日,使用using声明 通过base类指针或者引用访问 (这个和虚函数无关) 情况2 如果是通过通过base类指针或者引用访问 隐藏派生类同名函数。...三、如何将隐藏行为覆盖掉 情况1 如果是通过派生类访问一个函数派生类局部作用域隐藏上层 base函数 为了让隐藏起来名字重见天日,使用using声明 通过base类指针或者引用访问 (这个和虚函数无关...答:隐藏分为2个情况,同名函数查找过程 派生类 基类 全局 情况1 如果是通过派生类访问一个函数派生类局部作用域隐藏上层 base同名函数

1.4K10

【编程陷阱】编写出色C++代码:遵循注意事项和最佳实践

继承注意点 4.1 构造函数 派生类构造函数,需要保证调用基类构造【默认调用基类无参构造,如果基类创新提供了新有参构造,则派生类构造易出错】,见3.3 牛牛书 解决办法:最好每次提供新构造函数时都再提供一个无参默认构造函数...4.1.1 构造函数形参 构造函数参数最好不要和class 数据同名,否则需要加上this,不然出错!...()<<" "<<base.getY()<<endl; return 0; } 4.1.2 构造函数继承 派生类构造函数调用前需要调用基类构造函数,并且派生类新增数据需要加this...纯虚函数声明和定义一般形式如下: class AbstractBase { public: virtual void A() const = 0; // 纯虚函数声明,不是xx(){} const...=0; virtual ~AbstractBase() {} // 虚析构函数 }; 注意: 后续派生类实现必须是 class AbstractBase { public:

14410
  • 惯用法之CRTP

    imp(),而该函数在基类Base中是没有声明,所以,我们可以理解为对于CRTP,在基类中调用派生类成员函数,扩展了基类功能。...而对于普通继承,则是派生类中调用基类成员函数,扩展了派生类功能,这就是我们所说颠倒继承。 使用场景 俗话说,存在即合理。既然有CRTP,那么其必然有自己存在道理。...()函数,也实现了与virtual函数一样效果,所以使用CRTP另外一个好处是避免冗余代码。...局限性 既然CRTP能实现多态性,且其性能优于virtual,那么virtual还有没有存在必要么? 虽然CRTP最终还是调用派生类成员函数。...但是,问题在于Base类实际上是一个模板类,而不是一个实际类。因此,如果存在名为Derived和Derived1派生类,则基类模板初始化将具有不同类型。

    81820

    TypeScript 官方手册翻译计划【十二】:类

    — 它返回类型始终是类实例类型 super 调用 和 JavaScript 一样,如果你有一个基类和一个派生类,那么在派生类中使用 this....通过一个基类引用去引用一个派生类,是很常见(并且总是合法!)...一种做法: // 通过一个基类引用去命名一个派生类实例 const b: Base = d; // 没有问题 b.greet(); 如果派生类 Derived 没有遵循基类 Base 约束,会怎么样呢...当用 new 实例化一个泛型类时候,它类型参数就像在函数调用中那样被推断出来: class Box { contents: Type; constructor(value...class 'Base'. // 忘记实现抽象成员 } 抽象构造签名 有时候你想要接受一个类构造器函数作为参数,让它产生某个类实例,并且这个类是从某个抽象类派生过来

    2.6K10

    总结

    ,保护和公有,但是私有的成员不能够被直接使用,有参构造函数和析构函数派生类构造函数与析构函数也必须有参,对派生类上一层基类中析构与构造进行定义, `例如:class base...`例: class base {protected:int a; }; class second:public base { };` 派生类中有基类中所有的成员,并且本身成员也保留,但也存在基类中函数并不能实现想要功能...其次是虚函数,虚函数其中一个作用便是可以实现多态,在基类中定义一个函数格式为: virtual 返回类型 函数名(); 这样有这个基类产生派生类中可以对virtual后函数进行定义,但定义时要和基类中定义函数方式相同...定义方式:virtual 返回类型 函数名()=0; 虚函数可以实现多态,最简单一个应用则是将派生类引用或传址给基类,这样基类中函数会根据派生类对应函数定义来确定函数功能,主要采用是传址和引用两个方式...通过这种方式就可以在使用不同类时,让每一个类都拥有自己独特需要功能函数,不需要再在派生类中对想要函数功能进行重新定义` ,

    16310

    深入理解Python面向对象-类特殊成员

    (self.foo) # 类内部访问 class Device(Base): def show(self): print(self.foo) # 派生类中访问 obj = Base...# 类内部访问 obj_son = Device() obj_son.show() # 派生类访问 报错:AttributeError: type object 'Base' has no attribute...当我们在类上面加上一些说明,通过此方法可以进行查看,同样也可以查看库函数说明 __module__ 和 class__ __module__ 表示当前操作对象在那个模块 __class 表示当前操作对象类是什么...,占据同一块内存,也就是说在内存中只创建了一个对象,但是构造函数调用了两次。...,这个牵扯到反射机制,我们放在下一篇进行详细说明,今天文章就到这里了,你有没有Get到新技能呢?

    51810

    C++核心准则C.120:类层次体系只用于表现固有的阶层结构‍

    确保用基类表现想法准确地匹配所有的派生类型并且找不到使用继承这样紧耦合之外更合适方式。...继承通常意味着派生类型需要覆盖某个基类函数或者需要访问保护成员。...这段代码接口定义函数大多数派生类都无法很好地实现。基类成了实现时负担。进一步说,容器用户实际上无法依赖成员函数合理,高效地执行有意义操作;它可能会抛出异常。...因此用户必须求助于运行时检查以便决定用或不用这个普遍接口而选择通过动态类型查询(例如dynamic_cast)获得特殊接口。...在所有使用非公开基类B而派生类D没有覆盖B函数或者访问B保护型数据成员时进行提示。其中B不属于下面的情况:空,D模板参数或参数包,被D特化模板类。

    35620

    C++核心准则C.120:类层次体系只用于表现固有的阶层结构‍

    确保用基类表现想法准确地匹配所有的派生类型并且找不到使用继承这样紧耦合之外更合适方式。 ...继承通常意味着派生类型需要覆盖某个基类函数或者需要访问保护成员。 ...这段代码接口定义函数大多数派生类都无法很好地实现。基类成了实现时负担。进一步说,容器用户实际上无法依赖成员函数合理,高效地执行有意义操作;它可能会抛出异常。...因此用户必须求助于运行时检查以便决定用或不用这个普遍接口而选择通过动态类型查询(例如dynamic_cast)获得特殊接口。 ...在所有使用非公开基类B而派生类D没有覆盖B函数或者访问B保护型数据成员时进行提示。其中B不属于下面的情况:空,D模板参数或参数包,被D特化模板类。

    39640

    C++核心准则C.35:基类析构函数要么是公开函数,要么是保护非虚函数

    C.35: A base class destructor should be either public and virtual, or protected and nonvirtual 基类析构函数要么是公开函数...如果析构函数时保护,那么调用侧代码就无法通过基类类型指针销毁派生类对象,这是析构函数就没有必要一定是虚函数。析构函数是保护而不是私有的,这样派生类析构函数才能调用它。...虚函数定义了派生类接口,它可以在不关注派生类情况下使用。如果接口允许对象,那么这个销毁过程应该是安全。...我们可以想象一种需要保护函数析构函数情况:当希望允许派生类对象(只有这个类型)通过基类指针销毁另外一个对象(不是它自己)时。但是我们还没有在实际开发中遇到这种情况。...拥有虚函数函数要么是公开函数,要么是保护非虚函数。 译者注:拥有虚函数一般就意味着它有派生类

    1K20

    关键字《override》简析

    在C++中,虚函数是最常见实现多态机制之一,来个最简单例子温习一下: class Base // 基类 { public: virtual void f(){cout << "Base::...< endl;} }; (以上代码请忽略排版风格) 以上是一个基类 Base 及其派生子类最简示例,基类中有一个普通虚函数 f( ),并且派生类们都复写(即override)了该虚函数。...危险就在于此,人类是一个有诸多毛病物种,其中一个根深蒂固毛病是自以为是和粗心大意,因此以下代码很有可能出自某个同胞之手: class Derived3 : public Base // 派生类3 {...现在问题很明显了: 由于人类愚蠢,派生类函数复写,很有可能出现乌龙——人类自以为复写了基类函数(比如 void f( )),但实际上却写了另一个函数(比如 void f(int)),要命是...蹬蹬~噔噔~憋了半天主角终于出场鸟: class Derived3 : public Base // 派生类3 { // 注意: // 此处 override 明明白白告诉编译器:我要复写虚函数

    55720

    什么时候使用虚析构函数

    问题 什么时候该定义虚析构函数,为什么要这么做? 回答 当你通过一个基类指针去删除(delete)派生对象时候,虚析构函数就很用了。...输出如下: Base Constructor Called Derived constructor called Base Destructor called 我们发现派生类析构函数并没有调用,这是有问题...,有可能会造成内存泄漏,而解决这个问题办法就是将 Base 析构函数定义为虚(virtual), class Base { public: Base(){ cout <<...called 总结起来就是:当你程序满足以下任何一项时,都无需定义基类虚拟析构函数,否则你就应该定义为虚, 这个基类没有派生类 不在堆(heap)内存实例化 没有指向派生类基类指针或引用 对于 1...,还是很常见,有的时候我们只是单纯一个类,并没有派生它打算,那这个时候就无需将它析构函数定义为虚(virtual)了。

    88720

    【多态】【虚表指针与虚表】【多继承中多态】

    Person 析构函数,即 p2 没办法去调用到 Student 析构函数去清理类内数据。...假设这里我们没有重写 B 类函数,那么 B 类也是没办法生成对象。...我们给 Base 再增加一个函数Func2 和一个 普通函数Func3 来观察一下: //代码一 //Base再增加一个函数Func2和一个普通函数Func3 class Base { public...b1; Base2 b2; Derive d; return 0; } 比起单继承,多继承派生类会生成多份虚表,也就印证了一个道理:一个对象虚表不只有一张!...由此可以看出,派生类成员函数被放到了第一个父类表中,(所谓一个父类是按照声明顺序来判断)!然后其他规则是和单继承一样

    1.2K30

    【日更计划101】数字IC基础题【SV部分】

    上期答案 [226] 在派生类中可以覆盖基类中约束嘛?如果可以,如何实现? 可以通过使用相同约束名称在派生类中重写基类定义约束。...下面是一个示例 class Base; rand int a ; rand int b; constraint c_a_b_const {a < b;} endclass...两者并没有区别,在基类中如果定义了virtual关键字,那么派生类也会继承该属性,无论有没有显式二次声明。...[230] 现有下面两个类,请问在示例代码中compute_crc函数调用顺序是?...end 调用了基类compute_crc 调用了派生类compute_crc 调用了派生类compute_crc,虽然使用是基类句柄,但是方法定义为虚方法,所以要根据对象类型进行调用 本期题目

    50740

    C++编程经验(2):为虚基类做虚析构函数必要性

    这个要提一下,如果记不住就记住:如果不做虚析构函数,会有内存泄漏 解释 定义一个基类指针p,在delete p时,如果基类析构函数是虚函数,这时只会看p所赋值对象,如果p赋值对象是派生类对象,...就会调用派生类析构函数;如果p赋值对象是基类对象,就会调用基类析构函数,这样就不会造成内存泄露。...如果基类析构函数不是虚函数,在delete p时,调用析构函数时,只会看指针数据类型,而不会去看赋值对象,这样就会造成内存泄露。 多少学点设计模式就清楚了。...#include using namespace std; class Base{ //此处省去,一切从简 }; //接下来是一个子类 class Inherit :public...Base{ //此处省去,一切从简 }; //重点看调用 int main() { Base *p = new Inherit; //这种方式调用,这时候有没有虚析构就不一样了 delete

    57710

    代码重用

    c++一个主要目标就是促进代码重用,缩短代码开发时间。其中继承就是实现该目标的机制之一。 1. 私有继承 私有继承提供特性与包含相同:获得实现,并不获得接口。...下面我们看一个例子: class Base{...}; class BaseA : public Base{...}; class BaseB : public Base{...}; class Abc...Base类对象一个副本。...从本质上讲,应该是继承BaseA和BaseB类对象共享了一个Base对象。这样就可以简单使用多态。 针对虚基类,在设计时候需要对其类构造函数采用一种新方法。...因此上述ba信息必不能传递给子对象Base,然而编译器会使用Base默认构造函数,在构造派生类对象之前构造基类对象组件。如果不希望使用默认构造函数来构造虚基类函对象,则需要显式地调用基类构造函数

    61240

    C++关键知识点梳理

    ;避免额外深度拷贝;templatetypename std::remove_reference::type&& move(T&& a) noexcept{ return...每个虚继承子类都有一个虚基类指针(占用一个指针存储空间,4字节)和虚基类表(不占用类对象存储空间)当派生类重新定义虚函数时,则将派生类函数地址添加到虚函数表中。...当一个基类指针指向一个派生类对象时,虚函数表指针指向派生类对象函数表。当调用虚函数时,由于派生类对象重写了派生类对应函数表项,基类在调用时会调用派生类函数,从而产生多态。...虚析构函数:为了防止delete指向派生类对象基类指针时只调用基类析构函数引起内存泄漏using namespace std;class Base {public: virtual ~ Base...,则delete pb时只会调用Base析构函数纯虚函数:虚函数声明时候加上=0,包含纯虚函数类是抽象类,不可实例化,纯虚函数必须被派生类实现。

    95630

    虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

    此外,上述小例子还隐含另一个知识点,我们把出错语句屏蔽掉,看输出: Rectangle::Draw() ~Rectangle() ~IRectangle() 即派生类和基类析构函数都会被调用...更甚者,问题远远没那么简单,我们知道delete pI ; 会先调用析构函数,再释 放内存(operator delete),上面的例子因为派生类和基类现在大小都是4个字节即一个vptr,故不存在释放内存崩溃情况...将基类析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个函数,基类大小就为一个vptr ,此时基类和派生类大小都是4个字节,p也指向派生类首地址,问题解决,参考规则3。...= sizeD,参照规则4,pb[1] 按照B大小去跨越,指向根本不是一个真正B对象,当然也不是一个D对象,因为找到D[1] 虚函数表位置是错,故调用析构函数出错。...of the operand is different from its dynamic type, the static type shall be a base class of the operand

    1K20

    虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

    此外,上述小例子还隐含另一个知识点,我们把出错语句屏蔽掉,看输出: Rectangle::Draw() ~Rectangle() ~IRectangle() 即派生类和基类析构函数都会被调用...更甚者,问题远远没那么简单,我们知道delete pI ; 会先调用析构函数,再释 放内存(operator delete),上面的例子因为派生类和基类现在大小都是4个字节即一个vptr,故不存在释放内存崩溃情况...将基类析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个函数,基类大小就为一个vptr ,此时基类和派生类大小都是4个字节,p也指向派生类首地址,问题解决,参考规则3。...= sizeD,参照规则4,pb[1] 按照B大小去跨越,指向根本不是一个真正B对象,当然也不是一个D对象,因为找到D[1] 虚函数表位置是错,故调用析构函数出错。... of the operand is different from its dynamic type, the static type shall be a base class of the  operand

    95700

    C++:51---继承中构造函数、析构函数、拷贝控制一系列规则

    如果在基类中有一个不可访问或删除掉析构函数,则派生类中合成默认和拷贝构造函数将是被删除,因为编译器无法销毁派生类对象基类部分 编译器不会合成一个删除掉移动操作。...除非Quote派生类含有排斥移动成员,构造派生类自动获得合成移动操作 class Quote { public: Quote() = default;.../移动属于基类部分,那么可能会导致基类部分数据不明确(这是建议性) 例如: class Base { //基类成员 }; class D :public Base { public: D(const...} }; 派生类赋值运算符 与拷贝和移动构造函数一样,派生类赋值运算符页必须显式地为其基类部分赋值: 例如: class Base { //基类成员 }; class D :public Base...相反,派生类获得多个继承构造函数 例如:基类有一个接受两个形参构造函数,其中第二个形参含有默认实参,则派生类获得两个构造函数一个构造函数接受两个形参(都没有实参),另一个构造函数只接受一个形参

    1.3K30
    领券