覆盖C ++派生类中的数据成员

时间:2014-03-31 08:07:15

标签: c++ shadowing redefine inherited

我对C ++重新定义有疑问。我在Derived类中分配内存,所以我需要在Base类中保留这个内存。所以,我需要考虑Base类中的属性与Derived类中的属性相同,而且我不知道C ++中是否可以。

class Base {
 protected:
  float * a;
  Base() {}
 public:
  virtual void reset() {
    a = 0;
  }  
  virtual void exec() {
    printf("Memory a: %x\n",a);
  }
};  

class Derivada: virtual public Base {
 protected:
  float * a;
  Derivada() {}
  virtual void reset() {
    a = new float[256];
  }
};

int main() {
  Derivada *hija= new Derivada();    
  hija->reset();
  hija->exec();
  delete hija;
}

我真的需要做重载,因为它是我真正问题的一个例子。我有两个不同的类Base,每个分支中有一个,我的两个分支,CVS,我有相同的测试(Derived an main,code)。

在这个类Base中,我有这个属性,在另一个类Base中,我没有这个属性,所以我必须把它放在Derived类中进行编译。

我不想制作两个不同的测试代码,所以我需要覆盖属性

2 个答案:

答案 0 :(得分:3)

不要重新声明派生类的成员。单词" protected"确保可见性。

如果您重新声明该成员,您将拥有一名新成员。这称为阴影。参见,例如

答案 1 :(得分:2)

你可以这样做(但需要C ++ 11):

#include <type_traits>

// A way to check for 'attr' data member presence/absence using SFINAE
template<class T> constexpr auto missing_attr(T) -> decltype(T::attr, bool())
{
  return false;
}
constexpr bool missing_attr(...) { return true; }

struct Base { /* There might be (or not) a float data member 'attr' */ };

template<bool> struct Inject;
template<> struct Inject<true> { float attr = 0.0; };
template<> struct Inject<false> {};

struct Derived : public Base, protected Inject<missing_attr(Base())>
{
  void do_something_with_attr()
  {
    // Derived has only one 'float attr' (it can be from Base or from Inject).
    a *= a;
  }
};

还有其他方法可以检测数据成员是否存在,例如member detector idiom(兼容C ++ 03)。