【问题标题】:Base class functions that use derived class variables使用派生类变量的基类函数
【发布时间】:2014-09-25 12:18:45
【问题描述】:

在c++中,有没有一种标准的方法可以在基类中创建一个可以使用派生类变量的函数?

class Foo{
private:
    int x;
public: 
    Foo(){
        x = 2;
    }
    void print(){
        std::cout << x << std::endl;
    }
};

class Derived : public Foo{
private:
    int x;
public: 
    Derived(){
        x = 4;
    }

};


void main()
{
    Derived a;
    a.print();
}

此代码打印基类 ( 2 ) 的变量。有没有办法让许多派生类使用的函数使用类的私有变量而不将它们作为参数传递?

编辑:我的意图是避免为每个派生类编写相同的代码。 例如,我想要一个 get_var(),但是这个函数应该返回那个自己的类的变量。我知道我可以制作 virtual 和 override,但我一直在寻找一种不需要一次又一次地编写的方式。

【问题讨论】:

  • 基类不应该知道它的派生类型。要求这是一个糟糕的设计。
  • 你需要实现一个虚拟的getA 方法。
  • 如果您在 Foo 中将 'x' 声明为受保护,而不在 Derived 中再次声明它。这就是你想要的吗?
  • 不,我希望我的派生类有一个功能相同的函数,但有自己的变量。每个都有不同的值。
  • @user3023605 使print() 成为虚拟并在派生类中覆盖它

标签: c++ class derived


【解决方案1】:

不,基类不可能直接访问派生类中的任何内容。派生类与其基类共享任何内容的唯一方法是重写基类的虚拟成员函数。

但是,在您的情况下,这不是必需的:派生类可以在基类中设置变量x,一旦您将其设置为protected,并将其自己的声明视为不必要:

class Foo{
protected: // Make x visible to derived classes
    int x;
public: 
    Foo(){
        x = 2;
    }
    void print(){
        std::cout << x << std::endl;
    }
};

class Derived : public Foo{
public: 
    Derived(){
        x = 4;
    }
};

【讨论】:

  • 这会覆盖基类 x 吗?如果我进行多个派生,它们会共享相同的 x/值吗?
  • @user3023605 派生类的每个实例也有一个基类的实例。所以不,每个实例都有自己的x
  • 这正是我想要的!谢谢!我希望他的方法没有缺点。
  • @user3023605 每个Foo 的实例或从Foo 派生的类只有一个x。该值在子类之间共享,但仅在单个对象的范围内; Foo 的其他实例或从它派生的类将获得自己的 x
猜你喜欢
  • 2018-05-19
  • 2018-01-20
  • 1970-01-01
  • 2010-10-17
  • 2011-07-14
  • 2014-01-01
  • 2011-06-19
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多