【问题标题】:I need to access a derived class member through the base class static variable我需要通过基类静态变量访问派生类成员
【发布时间】:2012-02-15 19:24:48
【问题描述】:

我需要通过基类变量访问派生类成员变量。

Class A{

};

Class B:public A {
  int data;  
};

现在我需要做这样的事情

A *pb = new B()
pb->data = 10;

但问题是没有它我无法访问 Derived 成员类。

是的,我知道如何让它与虚函数一起工作。

谢谢,非常感谢您的帮助。

【问题讨论】:

    标签: c++ inheritance virtual-functions


    【解决方案1】:

    需求指向错误的设计。

    但如果你真的坚持写不好的代码,你可以直接转回B *

    【讨论】:

    • 是的,其实我的代码没有这样的情况。但只是想知道,如果我必须做这样的事情......但是它为什么会造成错误的设计,所以你的意思是,所有派生类成员都只需要通过构造函数进行初始化/修改????还是通过虚函数???
    • @howtechstuffworks 从父级访问派生类成员意味着出现问题。 Parent 本身就是一个可行的对象,并且应该能够在没有任何派生对象的情况下存在,除非它是一个纯虚拟类。正确的做法是通过在父类级别定义的虚函数。
    • ^ 是的,它现在是这样工作的,它是一个具有纯虚函数的抽象类......但是我想知道这两者之间有什么区别?反正我们要通过虚拟函数来改变它,为什么不使用相同的东西来datamember并直接改变它......我的成员是私有的,我正在谈论一个朋友类......
    • @howtechstuffworks 我相信动态调度仅适用于函数(因为除其他原因外,内存中类的所有实例只有一个函数实例)。
    • ^ @littleadv:是的,我知道有一定的做事方式,这就是我们遵循 OOP 的原因,但我正试图为这些情况找到一个具体的答案......请原谅我,如果我很傻...\
    【解决方案2】:

    没有虚函数,你唯一能做的就是向下转换它。有几种方法可以解决这个问题:

    • 如果您启用了 RTTI 并且父类中至少有一个虚函数,则可以使用 dynamic_cast,这将让您检查转换是否成功。
    • static_cast 可让您转换到继承树中低于您的内容,但您无法检查它是否成功。
    • 您也可以完全抛开谨慎,使用 C 风格的演员表。

    【讨论】:

    • 没有虚函数,dynamic_cast 不可用。
    • ^ 有道理......我想知道,如果我们有像虚拟变量之类的东西,这会让生活更轻松............但是动态演员很方便。 ....谢谢
    • ^ 是的.....我使用了虚拟析构函数....很好的捕捉....再次......我没有遇到这种情况(还),让我的想象力鸟飞……对不起,如果我傻了……
    • 回复某人时应使用@标记。我不知道你编辑了答案。幸运的是,我回到了这个帖子来改变投票。
    • @LuchianGrigore 也感谢您提供的信息 :)
    【解决方案3】:

    简短的回答:你不能。因为你的编译器不知道pb 是什么。它可以是A 类型。但是,您可以使用dynamic_cast,它返回一个B 指针或NULL(如果不可能的话)。

    A *pa = new B();
    B *pb = dynamic_cast<B*>(pa);
    if (pb) {
        pb->data = 10;
    }
    else {
        ...
    }
    

    无论如何,如果您需要这样做,这可能意味着您应该修改您的设计,因为向上转型不是一个好主意。但有时,你就是无法避免它。例如。使用外部库等时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2021-12-05
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多