【问题标题】:Reaching inherited variables with base class pointers使用基类指针访问继承的变量
【发布时间】:2013-07-20 21:56:27
【问题描述】:

我学习了虚函数的工作:如果继承的类从基类继承一个函数,并且每个函数都是自定义的,我可以用指向基类的指针调用这些函数,这样:

BaseClass* PointerName = &InheritedClassObject;

但是变量呢?我在网站上找到了this question,它告诉我:我无法在 C++ 中创建虚拟变量。我的经验证明了这一点:对于变量,Visual C++ 说:'virtual' is not allowed

那么,使用基类指针来获取属于继承类的(n 个继承的)变量的值的方法是什么?

【问题讨论】:

  • 你的基类怎么知道一个变量将被添加到从它派生的每个类中? (并且对于每个派生类等,此变量将具有相同的类型。)
  • 我想调用从基类继承的变量,因此所有继承的类都有它们。
  • 你能举个例子吗?您的问题可能有一个非常简单的解决方案。
  • @ZoltánSchmidt 查看我的回答。我认为问题的措辞可能有些混乱。如果没有,请告诉我,我将删除我的回复。
  • @DyP 我的确切问题是这样的表达式:PointerArray[Object.X][Object.Y] = &Object;(其中Object 是继承的类对象,XY 是从基类继承的)什么也不做。 PointerArray[Object.X][Object.Y] 的值仍然相同,最肯定是因为 XY 都没有被调用。 @史蒂夫P。好的!

标签: c++ oop pointers inheritance virtual-functions


【解决方案1】:

根据您的评论,我想您想问的是子类是否如何访问其父类的变量。考虑这个例子:

class Parent 
{
public:
  Parent(): x(0) {}
  virtual ~Parent() {}

protected:
  int x;
};

class Child: public Parent
{
public:
  Child(): Parent(), num(0) {}

private:
  int num;
};

void Child::foo() 
{
  num = x; //Gets Parent's x, 
}

注意:
如果您在 Child 中定义了一个 x,则会掩盖 Parent 中的 x。所以,如果你想得到Parent 中的x,你需要:Parent::x。要简单地从Child c 获取x,如果xpublic,则使用c.x;如果xprotectedprivate,则使用getter:

int Child::getNum()
{
     return num;
}

【讨论】:

  • 没错,我已经有一段时间没有使用 C++ 编程了。谢谢。
  • 在我的程序中,父类仅用于声明每个继承类拥有的变量,所以这不是问题。但是,您的代码对我来说并不完全清楚:parent() 显然是一个函数,但 x(0) {} 是什么?具有变量名称和零输入的函数?无论如何,对于我的确切问题,请参阅主帖下方的评论。
  • @ZoltánSchmidt 它只是将x 初始化为0。我进行了编辑。它应该会有所帮助。
  • @ZoltánSchmidt 对于: x(0),请参阅What is this weird colon-member syntax in the constructor?
【解决方案2】:

你没有。虚函数使用它们,做任何需要做的事情并在需要时返回结果。

【讨论】:

    【解决方案3】:

    如果继承类被强制转换回基类,则不能使用任何函数、数据成员。但是,您可以使用虚拟函数更改这些变量。示例:

    #include <iostream>
    
    class BaseClass {
    public:
      BaseClass() {}
      virtual void do_smth() = 0;
    
    private:
    };
    
    class InheritedClass: public BaseClass {
    public:
      InheritedClass(): a(1) {}
      virtual void do_smth() { std::cout << ++a << std::endl; }
    private:
      int a;
    };
    
    int main() {
      BaseClass* ptr = new InheritedClass();
      ptr->do_smth();
      return 0;
    }
    

    在这段代码中,虚函数确实改变了属于InheritedClass的变量。

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多