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

正在从iostream中读取超类的子类实例。>>运算符如何知道是哪个子类?

在C++中,iostream库中的>>运算符是用于从输入流中读取数据的。当从iostream中读取超类的子类实例时,>>运算符无法直接知道是哪个子类的实例。这是因为C++的静态类型特性,编译器在编译时只知道变量的静态类型,而不知道其动态类型。

为了解决这个问题,通常需要使用多态性(polymorphism)来实现。多态性是面向对象编程的一个重要概念,它允许将子类的实例赋值给超类的指针或引用,并在运行时根据实际对象的类型来调用相应的方法。

在C++中,可以通过将基类的析构函数声明为虚函数来实现多态性。当使用>>运算符从iostream中读取超类的子类实例时,编译器会根据指针或引用的静态类型调用相应的基类的析构函数。然后,在运行时,根据实际对象的类型来调用相应子类的析构函数。

以下是一个示例代码,演示了如何使用多态性来读取超类的子类实例:

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

class SuperClass {
public:
    virtual ~SuperClass() {}
    virtual void print() {
        std::cout << "This is a SuperClass." << std::endl;
    }
};

class SubClassA : public SuperClass {
public:
    void print() override {
        std::cout << "This is a SubClassA." << std::endl;
    }
};

class SubClassB : public SuperClass {
public:
    void print() override {
        std::cout << "This is a SubClassB." << std::endl;
    }
};

int main() {
    SuperClass* obj;

    // 从iostream中读取SubClassA的实例
    obj = new SubClassA();
    std::cin >> *obj;
    obj->print();

    // 从iostream中读取SubClassB的实例
    obj = new SubClassB();
    std::cin >> *obj;
    obj->print();

    delete obj;
    return 0;
}

在上述示例中,通过将基类的析构函数声明为虚函数,实现了多态性。当从iostream中读取子类实例时,根据实际对象的类型来调用相应子类的print()方法。

需要注意的是,上述示例中的代码片段只是一个示例,实际应用中可能需要根据具体的需求进行适当的修改和扩展。

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

相关·内容

【C++】C++核心编程部分-内存分区模型-引用-函数提高-与对象-文件操作

通过上一个知识点《成员变量和成员函数分开存储》我们知道C++成员变量和成员函数分开存储。...每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会公用一块代码。 那么问题:这一块代码如何区分哪个对象调用自己呢?...继承同名成员处理方式 问题:当子类与父出现同名成员。如何通过子类对象,访问到子类或父同名数据呢?...继承同名静态成员处理方式 问题:继承同名静态成员在子类对象上如何进行访问呢? 静态成员和非静态成员出现同名,处理方式 一致。...抽象特点: 无法实例化对象 子类必须重写抽象纯虚函数,否则也属于抽象 #include using namespace std; //纯虚函数和抽象 class Base

1.8K00

Python与面向对象

用于定义如何使用成员变量,因此一个行为和接口通过方法来定义 方法和变量: 私有:内部使用 公共:外部可见 面向对象程序设计方法 所有的东西都是对象 程序一大堆对象组合 通过消息传递,各对象知道自己该做什么...,用于实现按层分类概念 2.一个深度继承子类继承了层次每个祖先所有属性 3.、基、父 4.子类、派生 多态: 允许一个接口被多个通用动作使用特性,具体哪个动作与应用场合相关...连结至方式 将列在头部括号内,其从左到右顺序会决定树次序 由下至上,由左至右 继承方法专用化 继承先在子类寻找变量名,然后才查找,因此,子类属性重新定义来取代继承而来行为...子类可以完全取代从继承而来属性 也可以通过已覆盖方法回调来扩展方法 1.class ParClass(object): def setInfo(self,sex= 'Male' self.genda...,语法 super(type[,obj]) 运算符重载 运算重载指在方法拦截内置操作——当实例出现在内置操作,Python会自动调用自定义方法,并且返回自定义方法操作结果 运算符重载让拦截常规

1K80

Python设计模式(15):状态模式

事实上,根据实际设计程序具体情况,有两种改变状态方式:一种状态或者各个状态子类负责改变状态,另一种 Context 负责改变状态。 在下列情况下可以使用状态模式。...值得注意,以上描述没有说明哪个负责创建状态对象,因此该描述比较粗略。事实上,由哪个创建状态对象对于可扩展性是非常关键。现在分别对各种情况进行讨论。 情况 1 标准设计。...在状态(可以是),写一个根据现在状态创建子类对象方法 creteStateObj(),然后在 Context 负责调用该方法。...因为该方法已经当前状态子类对象,所以在 Context ,不必使用针对于状态条件语句。事实上,此时 Context 根本不知道所使用对象是哪个状态子类对象,只知道当前对象。...一般地说,使用状态模式要比使用策略模式在设计与实现方面会更加复杂一些,原因用户需要仔细考虑由谁负责状态转换问题,由 Context 负责还是由状态负责,还是由状态子类负责等。

46621

python Class() and

:成员变量或实例变量         成员方法:简称为方法,操作数据代码,用于定义如何使用成员变量;因此一个行为和接口通过方法来定义。     ...继承(Inheritance)         一个对象获得另一个对象属性过程;用于实现按层分类概念         一个深度继承子类继承了层次每个祖先所有属性         、基...、父子类、派生 多态性(Polymorphism)        允许一个接口被多个通用动作使用特性,具体使用哪个动作与应用场景相关。        ...,然后才查找,因此,子类可以对属性重新定义来取代继承而来行为。    ...    运算符重载指在方法(如__name__方法)拦截内置操作--当实例出现在内置操作,python会自动调用自定义方法,并且返回自定义方法操作结果。

88820

java 范型

因为编译器只知道fruitsFruit某个子类List,但并不知道这个子类具体是什么,为了类型安全,只好阻止向其中加入任何子类。 那么可不可以加入Fruit呢?很遗憾,也不可以。...读取数据 但是,由于编译器知道它总是Fruit子类型,因此我们总可以从中读取出Fruit对象: Fruit fruit = fruits.get(0); ?...error } } 存入数据: super 通配符类型同样不能实例化,Fruit 和其集合均可赋值 这里 add 时 Fruit 及其子类均可成功,为啥呢?...出于对类型安全考虑,我们可以加入Apple对象或者其任何子类(如RedApple)对象(因为编译器会自动向上转型),但由于编译器并不知道List内容究竟是Apple哪个,因此不允许加入特定任何类型...读取数据 编译器在不知道这个具体是什么,只能返回Object对象,因为Object任何Java最终祖先

77500

《Python入门09》揭秘python面向对象编程~

每个对象都属于特定,并被称为该类实例。 例如,如果你在窗外看到一只鸟,这只鸟就是“鸟类”一个实例。鸟类一个非常通用(抽 象),它有多个子类:你看到那只鸟可能属于子类“云雀”。...你可将“鸟类”视为由所有 鸟组成集合,而“云雀”其一个子集。一个对象为另一个对象子集时,前者就是后者子类。因此“云雀”为“鸟类”子类,而“鸟类”为“云雀”。...通过这样陈述,子类就很容易理解。但在面向对象编程子类关系意味深长,因 为由其支持方法定义所有实例都有该类所有方法,因此子类所有实例都有 所有方法。...创建Penguin时,你还可能想重写方法,即方法fly。鉴于企鹅不能飞,因此在Penguin 实例,方法fly应什么都不做或引发异常。...Person当然名称。class语句创建独立命名空间,用于在其中定义函数。一切看起来都挺 好,但你可能想知道参数self是什么。它指向对象本身。那么哪个对象呢?

65720

Python黑魔法之metaclass

•“Change”,例如技术词汇 metamorphosis,意思改变形态。 因此可以理解为 metaclass 为描述,同时可以改变子类形态。...通过一个实例来理解 metaclass 请手动在 ipython 搞代码,看看每一步都输出了什么,这样可以彻底理解创建和实例化步骤。...把上面的例子运行完之后就会明白很多了,正常情况下我们在父不能对子类属性进行操作,但是元可以。换种方式理解:元、装饰器、装饰器都可以归为元编程。...第二,用户自定义,只不过 type __call__ 运算符重载 当我们定义一个语句结束时,真正发生情况, Python 调用 type __call__ 运算符。...第三,metaclass type 子类,通过替换 type __call__ 运算符重载机制,“超越变形”正常 其实,理解了以上几点,我们就会明白,正是 Python 创建机制,给了

34620

Swift基础 类型铸造

或将该实例视为与自身层次结构其他地方不同子类。...Swift类型转换用is``as运算符实现。这两个运算符提供了一种简单而富有表现力方式来检查值类型或将值转换为其他类型。...定义类型铸造层次结构 您可以使用带有子类层次结构类型转换来检查特定实例类型,并将该实例转换为同一层次结构另一个。...压倒 特定类型常量或变量实际上可能指幕后子类实例。如果您认为情况就是这样,您可以尝试使用类型转换运算符**降到子类类型(as?或者as!)。 由于下调可能会失败,类型转换运算符有两种不同形式。...您事先不知道每个项目应使用哪个实际,因此使用类型转换运算符条件形式合适(as?)

6800

为什么日志要private static final

为什么声明日志记录器私有的、静态和final良好实践呢?日志记录器一个内部实现细节,因此它应该是私有的。对于所有实例,您只需要一个日志记录器,因此静态。...以这种方式声明日志记录器最大问题,您现在从获得所有日志记录与子类日志记录混合在一起,并且在日志输出,除非您查看源代码,否则无法识别哪些消息来自哪个。...如果有很多您不想看到日志记录,这是非常烦人,因为您不能过滤掉它。 另一个问题,您以不同方式设置日志级别的能力消失了,例如,如果子类驻留在与不同。...在这种情况下,如果试图从筛选出日志记录,则不能,因为实际运行时用于获取日志记录器。 最后,拥有一个受保护记录器似乎违反了基本面向对象原则。...为什么子类应该从横切关注点了解内部实现细节?无论如何,虽然这是一个愚蠢小咆哮,但是当您扩展一个声明像这样受保护日志记录器时,它确实很烦人。

2.1K20

C++ 重载运算符 继承 多态 (详细)

(一)重载运算符: (1)声明与定义格式 一般内声明,外定义,虽然可以在内定义,但 写前面堆一堆不好看!!!...)双目运算符重载为成员函数 当重载运算符为双目运算符时,形参表只有一个参数作为右操作数。...(3)单目运算符重载为成员函数 此时参数表没有参数,只有当前对象作为运算符一个操作数。...在编译时候能够确定对象所调用成员函数地址则为静态联编,一般调用方式; 动态联编:指的是在程序运行时候动态地进行,根据当时情况来确定调用哪个同名函数,父指针指向哪个子类,就调用哪个子类同名函数...在基实现纯虚函数方法在函数原型后加“=0” virtual void funtion()=0 1、为了方便使用多态特性,我们常常需要在基定义虚拟函数。

1K21

Python学习笔记整理(十五)编写

如果要保证子类构造方法也会执行构造器逻辑,一般都必须通过明确地调用__init__方法。...如果真的想运行构造方法并做适当修改,自然只能用这种方法进行调用:没有这样调用,子类会 完全取代(覆盖)构造器,或者子类没有设置__init__构造器情况下完全继承构造器方法。...有特殊属性__name__名字,就像模块一样有__name__属性模块名字。默认为行首行名称字符串。 7、抽象 上例Provider如何工作?...抽象就是会调用方法,但没有继承或定义该方法,而是期待该方法由子类填补。当行为无法预测,非得等到更为具体子类编写时才知道,可用这种方式把通用化。这种“填空”代码结构一般就是OOP软件框架。...从delegate方法角度来看,这个例子有时也称作抽象--也就是部分行为默认由其子类所提供

88310

5.1 子类

5.1 子类   子类拥有的功能更加丰富。   在本例,Manager类比Employee封装了更多数据,拥有更多功能。   ...在通过扩展定义子类时候,仅需要指出子类不同之处,因此,会将通用方法放在,而将具有特殊用途方法放在子类,这种将通用功能放在方法,在面向对象程序设计十分普遍。   ...假设x实际类型D,它是C子类,如果D定义了一个方法f(String),就直接调用它,否则就在D寻找f(String)方法,以此类推。   ...、Manager方法表,也可能Employee其他子类方法表;   (2)虚拟机搜索定义getSalary签名,此时,虚拟机已经知道应该调用哪个方法;   (3)虚拟机调用方法。...例如,由于Person抽象,表达式 new Person("Vince Vu")   这种方法,但可以创建一个具体子类对象。   虽然抽象不能实例化,但是可以引用非抽象子类对象。

1K90

【Python基础】07、Python

,用于保证程序和数据不受外部干扰且不会被误用 2、继承(Inheritance) 一个对象获得另一个对象属性过程;用于实现按层分类概念 一个深度继承子类继承了层次每个祖先所有属性 、...基、父 子类、派生 3、多态性(Polymorphism) 允许一个接口被多个通用动作使用特性,具体使用哪个动作与应用场合相关 “一个接口,多个方法”          用于为一组相关动作设计一个通用接口...调用会创建实例实例自动连结至创建了此实例 连结至其方式:        将列在头部括号内,其从左至右顺序会决定树次序 由下至上,由左至右 C1     C2      C3...子类可以完全取代从继承而来属性        也可以通过已覆盖方法回调来扩展方法 五、实例和其它对象内建函数 issubclass()        布尔函数,判断一个是否由另一个派生...__init(num,status)              #代表父    调用父类属性 2、运算符重载 运算符重载指在方法拦截内置操作——当实例出现在内置操作,Python会自动调用自定义方法

77710

派生多态虚函数?

不过在某些时候基还有这样一种成员,基希望它派生有权访问该成员,同时禁止其他用户访问。我们用受保护(protected)访问运算符说明这样成员。...现在,我们只需知道访问说明符作用是控制派生从基继承而来成员是否对派生用户可见。 如果一个派生公有的,则基公有成员也是派生接口组成部分。...1.虚析构与纯虚析构共性: 解决父指针释放子类对象不干净问题 都需要有具体函数实现 2.区别: 如果纯虚析构,该类属于抽象,无法实例化 .虚析构语法: virtual ~名(){}...func() = 0; 抽象无法实例化对象(堆区,栈区) 子类也必须要重写父虚函数,否则子类也就是抽象 具体代码示意如下所示 #include using namespace...void func() = 0; /* 抽象无法实例化对象(堆区,栈区) 子类也必须要重写父虚函数,否则子类也就是抽象 */ virtual ~base()

14720

【计算机本科补全计划】Java学习笔记(五) 运算符

运算符主要是决定哪个值应该赋值给变量。 variable x = (expression) ?...该运算符用于操作对象实例,检查该对象是否一个特定类型(类型或接口类型)。...我们要时刻谨记,一种抽象,当一个包涵范围越广时候,他特性必然越少,因为要满足所有的子类都兼容,不然不存在继承,好比人类这个没有男女属性,但是男性人类,拥有人类所有特征,还有JJ,所以包含了人类这个所有内容...在下面的代码: Vehicle v2 = new Car(); // v2 Car 类型 子类类型,但父不是子类类型。...子类实例可以声明为父类型,但父实例不能声明为子类型。 4、 Java运算符优先级 类别 操作符 关联性 后缀 () [] . (点操作符) 左到右 一元 + + - !

70850

Python metaclass 简介

metaclass 译为元,可以理解为 metaclass 为描述,同时可以改变子类形态,本文介绍相关内容。...Python class,对于大部分面向对象语言来说,class一段定义了如何产生object代码块。在Python这一定义也成立。 但是在Python,class并不只有这一角色。...而metaclass 控制实例(这里表示本身定义,不是实例)产生“ 直接看一个 metaclass例子可以有更直观理解 metaclass 实例 class Mymeta(..._call__ 运算符重载 当我们定义一个语句结束时,真正发生情况, Python 调用 type __call__ 运算符。...同时需要注意,在class定义__metaclass__ attribute并不会被子类继承。被子类继承metaclass,也就是母.__class__ attribute。

37920

《逆袭进大厂》第三弹之C++提高篇79问79答

1、在对象内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,成员函数单独放在代码段。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前哪个对象在调用它。...例如你建立了多个对象时,在调用成员函数时,你并不知道具体哪个对象在调用,此时你可以通过查看this指针来查看具体哪个对象在调用。...154、如何设计一个计算子类个数?...168、如何阻止一个实例化?有哪些方法?...抽象不能用于实例化对象,否则会报错。抽象一般用于定义一些公有的方法。子类继承抽象也必须实现其中纯虚函数才能实例化对象。

2.2K30

《Python基础教程》 读书笔记 第七章 更加抽象(下)

这跟函数内局部和全局变量行为十分似。 7.2.5指定 子类可以扩展定义,将其他名写在C1dSS语句后圆括号内可以指定: >>> class Filter: ......) True >>> isinstance(s,str) False 如果只想知道一个对象属于哪个,可以使用_class一特性: >>> s....多态:多态实现将不同类型和对象进行同样对待特性—不需要知道对象属于哪个就能调用方法。 封装:对象可以将它们内部状态隐藏(或封装)起来。...继承:一个可以是一个或者多个子类子类继承所有方法。可以使用多个,这个特性可以用来组成功能正交部分(没有任何联系)。普通实现方式使用核心和一个或者多个混合。...程序员可以靠多态调用自己需要方法。不过如果想要知道对象到底有什么方法和特性,有些函数可以帮助完成这项工作。 面向对象设计:关于如何(或者说是否应该进行)面向对象设计有很多观点。

48620

C++基础知识复习

3.同一内存空间可以取多个别名 (当我们使用一些引用语法时候,无需关心编译器背后如何作用,但当我们分析奇怪语法现象时候,我们才会关系C++编译器怎么去做) pointer reference...---- 子类型关系具有单项传递性: CB子类型, BA子类型,所以CA子类型。...---- 虚函数继承 如果某个成员函数被声明成虚函数,那么他子类,以及子类子类 ,所计继承这个成员函数,也自动虚函数。...如果这个指针指向子类对象,那么会先调用该子类析构函数,再调用父析构函数。 如果指向对象,那么只调用父析构函数。...某些,现实项目和实现角度吗,都不需要实例化(不需要创建它对象)。 这个定义某些成员函数只是为了提供一个形式上接口,准备让自子类来做具体实现。

52110
领券