C++ 我需要通过基类静态变量访问派生类成员

C++ 我需要通过基类静态变量访问派生类成员,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,我需要通过基类变量访问派生类成员变量 Class A{ }; Class B:public A { int data; }; 现在我需要做一些像这样的事情 A *pb = new B() pb->data = 10; 但问题是,我无法使用它访问派生成员类 是的,我知道如何使用虚拟函数 谢谢,我真的很感谢你的帮助。需求表明设计有缺陷 但是如果你真的坚持写糟糕的代码,你可以回到B*这个需求指向错误的设计 但是如果你真的坚持写糟糕的代码,你可以回到B*而不使用虚拟函数,你唯一能做

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

Class A{

};

Class B:public A {
  int data;  
};
现在我需要做一些像这样的事情

A *pb = new B()
pb->data = 10;
但问题是,我无法使用它访问派生成员类

是的,我知道如何使用虚拟函数


谢谢,我真的很感谢你的帮助。

需求表明设计有缺陷


但是如果你真的坚持写糟糕的代码,你可以回到
B*

这个需求指向错误的设计


但是如果你真的坚持写糟糕的代码,你可以回到
B*

而不使用虚拟函数,你唯一能做的就是对它进行降级。有几种方法可以做到这一点:

  • 如果启用了RTTI并且父类中至少有一个虚拟函数,则可以使用dynamic_cast,这将允许您检查强制转换是否成功
  • 静态_cast将允许您对继承树中位于您下方的内容进行强制转换,但您将失去检查是否成功的能力
  • 你也可以完全无视警告,使用C型石膏

    • 如果没有虚拟功能,您唯一能做的就是对其进行降级。有几种方法可以做到这一点:

      • 如果启用了RTTI并且父类中至少有一个虚拟函数,则可以使用dynamic_cast,这将允许您检查强制转换是否成功
      • 静态_cast将允许您对继承树中位于您下方的内容进行强制转换,但您将失去检查是否成功的能力
      • 你也可以完全无视警告,使用C型石膏

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

          A *pa = new B();
          B *pb = dynamic_cast<B*>(pa);
          if (pb) {
              pb->data = 10;
          }
          else {
              ...
          }
          
          A*pa=newb();
          B*pb=动态_铸造(pa);
          如果(pb){
          pb->data=10;
          }
          否则{
          ...
          }
          

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

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

          A *pa = new B();
          B *pb = dynamic_cast<B*>(pa);
          if (pb) {
              pb->data = 10;
          }
          else {
              ...
          }
          
          A*pa=newb();
          B*pb=动态_铸造(pa);
          如果(pb){
          pb->data=10;
          }
          否则{
          ...
          }
          


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

          如果没有虚拟函数,则动态\u cast不可用。^有意义。。。。。。我想知道,我们是否有虚拟变量之类的东西,可以让生活更轻松。。。。。。。。但动态转换很方便。。。。。谢谢^是的。。。。。我使用虚拟析构函数。。。。抢手货再一次我还没有遇到这种情况,就让我的想象中的小鸟飞吧。。。对不起,如果我很傻的话……在回复某人时,你应该用@来标记。我不知道你编辑了答案。纯属运气,我回到这个帖子来更改投票结果。@LuchianGrigore也感谢您提供的信息:)如果没有虚拟功能,dynamic_cast不可用。^有道理。。。。。。我想知道,我们是否有虚拟变量之类的东西,可以让生活更轻松。。。。。。。。但动态转换很方便。。。。。谢谢^是的。。。。。我使用虚拟析构函数。。。。抢手货再一次我还没有遇到这种情况,就让我的想象中的小鸟飞吧。。。对不起,如果我很傻的话……在回复某人时,你应该用@来标记。我不知道你编辑了答案。纯属运气,我回到这个线程来更改投票。@LuchianGrigore也感谢您提供的信息:)是的,实际上我的代码没有这样的情况。但我只是想知道,如果我必须这样做。。。。但是为什么它会产生错误的设计,所以你的意思是,所有派生类成员只需要通过构造函数初始化/修改????还是通过虚拟函数?@howtechstuffworks从父级访问派生类成员意味着出了问题。父对象本身是一个可行的对象,并且应该能够在没有任何派生对象的情况下存在,除非它是一个纯虚拟类。正确的方法是通过在父类级别定义的虚拟函数。^是的,这就是它现在的工作方式,它是一个带有纯虚拟函数的抽象类。。。。。。。但我想知道这两者有什么区别?我们无论如何都要通过虚拟功能来改变它,为什么不使用相同的东西来改变datamember并直接改变它。。。。。我的成员是私有的,我说的是一个friend类……@howtechstuffworks我认为动态分派只对函数可用(因为,除其他原因外,内存中每个类的所有实例都只有一个函数实例)。^@LittledV:是的,我知道有一定的处理方法,这就是为什么我们遵循OOP,但我正试图为这些情况找到一个具体的答案。。。。对不起,如果我很傻…\n是的,实际上我的代码没有这样的情况。但我只是想知道,如果我必须这样做。。。。但是为什么它会产生错误的设计,所以你的意思是,所有派生类成员只需要通过构造函数初始化/修改????还是通过虚拟函数?@howtechstuffworks从父级访问派生类成员意味着出了问题。父对象本身是一个可行的对象,并且应该能够在没有任何派生对象的情况下存在,除非它是一个纯虚拟类。正确的方法是通过vir