首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在c++中通过父类访问子类的元素?

在c++中通过父类访问子类的元素?
EN

Stack Overflow用户
提问于 2013-05-18 09:26:12
回答 3查看 260关注 0票数 1
代码语言:javascript
运行
AI代码解释
复制
class game_list
{
    public:
        string name;
        float price;
        string platform;
        string console;
        string condition;
        bool is_portable;
        string N_bits;

};

class catridge_object:public game_list
{
    string N_bits;
    bool is_import;
};

class disk_object:public game_list
{
    string disk_type;
    int n_disk;
};

class digital_object:public game_list
{
    float file_size;
    bool is_for_pc;
};

game_list *pointerMain;

int main()
{
    int optionChosen=0;
    vector<game_list*> mainVector;

}

这里的game_list是父类,并且有派生自它的子类。我正在尝试创建一个向量mainVector将保存的game_class对象列表。现在,根据用户输入,向量中的所有对象都将具有game_list类中描述的公共属性,并且根据用户的选择,它将具有从父类派生的其他3个子类的附加信息。因此,我将使用以下命令创建一个dynamic game_list

代码语言:javascript
运行
AI代码解释
复制
pointerMain=new game_list;

看起来一切正常,但问题是当我尝试使用pointerMain->(any member of the child class)访问子类时,它不是这样工作的。你有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2013-05-18 09:33:43

您需要将pointerMain强制转换为派生类类型。

代码语言:javascript
运行
AI代码解释
复制
catridge_object* obj = dynamic_cast<catridge_object*>(pointerMain);
if (obj)
  obj->members_of_catridge_object...

此外,基类应该是多态的,因此您至少需要在基类中添加一个虚方法(最好的选择是析构函数成员)。

或者(对于某些类型转换):

代码语言:javascript
运行
AI代码解释
复制
static_cast<catridge_object*>(pointerMain)->members_of_catridge_object...;

注意,如果pointerMain是由new catridge_object制作的,则它可以工作,否则行为是未定义的。

票数 1
EN

Stack Overflow用户

发布于 2013-05-18 09:34:23

不是每个子类都有相同的成员,所以要访问它们,你需要知道实际的类型。要么向基类添加一个虚拟析构函数并使用dynamic_cast,要么将需要这些属性的功能放入一个虚拟函数(在基类中声明并由子类实现)

正如其他人指出的那样,new game_list将创建game_list类型的对象,而不是某个子类的对象。

如果您确实选择了RTTI (dynamic_cast)路由,请务必检查它是否返回一个非空指针(如果强制转换类型不匹配,它将返回非空指针)

票数 0
EN

Stack Overflow用户

发布于 2013-05-18 09:39:26

可以将基指针强制转换为派生类型的指针,以通过基指针访问派生类的成员。例如,以下代码在C++中有效,

代码语言:javascript
运行
AI代码解释
复制
((disk_object *)pointerMain)->n_disk=10;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16622666

复制
相关文章
C++中派生类成员的访问属性
在派生类中,对基类的继承方式可以有public(公用的)、private (私有的)和protected(保护的)3种。 不同的继承方式决定了基类成员在派生类中的访问属性。 简单地说: (1)  公用继承(public inheritance) 基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。 (2)  私有继承(private inheritance) 基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。 (3)  受保护的继承(protected inheritance) 基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。 保护成员的意思是:  不能被外界引用,但可以被派生类的成员引用。
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.1K0
类的继承 方法和属性的重写
当子类和父类进行同一件事进行不同的操作需要重新写方法(例如电脑鼠标点击打开图片,平板电脑触摸打开图片)
用户2965768
2019/01/28
1.5K0
PHP-私有属性继承和重写
1.3 面向对象三大特性 封装 继承 多态 1.4 私有属性继承和重写 私有属性可以继承但不能重写。 <?php class A { private $name='PHP'; public fun
cwl_java
2022/11/30
6350
JAVA中重写equals()方法的同时要重写hashcode()方法
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.hashCode
xiangzhihong
2018/02/01
1.8K0
派生类的构造过程
1、先基类、后对象、再子类 多继承,初始化顺序跟基类的声明顺序有关,从左到右。 对象 ,与声明类的顺序有关,从上到下。
我与梦想有个约会
2023/10/20
1510
派生类的构造过程
python @property 设置只读属性 重写 getter setter 方法
@property广泛应用在类的定义中,可以让调用者写出简短的代码,就可以重写属性的 get 和 set 方法,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
onety码生
2018/11/21
2.6K0
java中重载和重写的区别
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
全栈程序员站长
2022/09/08
6930
Java中的重载与重写的区别
java中的重载与重写的区别 1、重载发生在本类,重写发生在父类与子类之间; 2、重载的方法名必须相同,重写的方法名相同且返回值类型必须相同; 3、重载的参数列表不同,重写的参数列表必须相同。
全栈程序员站长
2022/07/18
8060
Python中的_new_方法的重写
new方法重写的步骤比较固定,直接上代码吧 # 代码 class MusicPlayer(object): # new方法的重写,是一个静态方法,必须主动传递cls参数 def __new__(cls, *args, **kwargs): # 1.创建对象时,new方法会被自动调用 print("创建对象,分配空间") # 2.为对象分配空间 instance = super().__new__(cls) #
benym
2022/07/14
7810
Java中的重载和重写的区别
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
共饮一杯无
2022/11/28
6120
Java中的重载和重写的区别
Java中的多态(重载和重写)
方法重写与方法重载之间的关系:重载发生在同一个类内部的两个方法或多个方法。重写发生在父类和子类之间。
你的明明呐丶
2022/06/27
6070
Java中的多态(重载和重写)
Java中的重载、重写和重构的区别
重载(overloaded): 重载就是在同一个类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
全栈程序员站长
2022/09/08
1.9K0
【说站】python中__new__的重写
1、重写__new__方法一定要return super().__new__(cls)。
很酷的站长
2022/11/23
7280
Java中的方法重载和重写(覆盖)
* 方法重载的判定:同一类中,方法名相同,参数列表不同(参数个数不同,参数列表中对应位置参数类型不同),其他方法返回值
用户7886150
2020/12/14
2.3K0
java中的UrlReWriter(url重写)_源码下载
==============================================
Hongten
2018/09/13
2.1K0
java中的UrlReWriter(url重写)_源码下载
css opacity属性_CSS中的opacity属性[通俗易懂]
With the growing need of making websites, the need for styling them has also increased. Therefore, CSS has become an indispensable part of creating websites. Thus one must be aware of which properties to use while creating a website.
全栈程序员站长
2022/09/01
3.2K0
css opacity属性_CSS中的opacity属性[通俗易懂]
TypeScript中的可选属性和只读属性
可选属性 接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 例如给函数传入的参数对象中只有部分属性赋值了。带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面
孙亖
2018/06/07
3K0
你真的了解Override吗,属性能够被重写吗?
最近想到了一个问题,Java的属性能够被Override吗?首先让我们看一下下面这个继承的例子。
三哥
2019/05/07
8130
你真的了解Override吗,属性能够被重写吗?
你真的了解Override吗,属性能够被重写吗?
最近想到了一个问题,Java的属性能够被Override吗?首先让我们看一下下面这个继承的例子。
三哥
2018/12/17
6930
Python使用元类约束派生类中必须实现指定的成员
创建派生类时指定元类,用来控制和约束派生类的创建过程,对派生类中的成员进行一定的限制。
Python小屋屋主
2021/12/29
1K0
Python使用元类约束派生类中必须实现指定的成员

相似问题

重写派生类中属性的特性

15

重写派生类中的NotMapped属性

10

使用派生类重写属性。

41

重写派生类中的公共属性

41

重写派生类中的设计器属性

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档