如何初始化基类中的唯一变量(继承)

时间:2016-08-08 09:53:22

标签: c++ inheritance derived-class

如果我在基类中声明了几个变量,它们将在每个派生类中定义,对吧?我只想在基类中为所有派生类提供一次变量。例如:

class Base{
public:
 virtual ~Base();

protected:
 Base();
 int fileIndex;
};

class DerivedA : public Base{
public:
 DerivedA();
 virtual ~DerivedA();
 void DoSth(); //using fileIndex
};

class DerivedB : public Base{
public:
 DerivedB();
 virtual ~DerivedB();
 void DoSthDifferent(); //using the same fileIndex
};

我该怎么做?

2 个答案:

答案 0 :(得分:2)

只需将fileIndex变为static变量:

static int fileIndex;

然后,所有派生类的所有实例将共享相同的值

答案 1 :(得分:1)

我假设这不是某些全局日志中的文件索引,需要保持整洁。 static可以做到这一点。

使用合成而不是(滥用)继承。

class FileAccessor
{
  int fileIndex;
  // Your stuff
};

Class A
{
  std::shared_ptr<FileAccessor> mFileAccessor;
public:
  A(std::shared_ptr<FileAccessor> fAccesor ) : mFileAccessor(fAccesor ) {}

  void DoSth () { /* use mFileAccessor*/ }
};

Class B
{
  std::shared_ptr<FileAccessor> mFileAccessor;
public:
  B(std::shared_ptr<FileAccessor> fAccesor ) : mFileAccessor(fAccesor ) {}

  void DoSth () { /* use mFileAccessor*/ }
};

int main()
{
  auto fAccesor = std::make_shared<FileAccessor>();
  A a{fAccesor};
  B b{fAccesor};
}

这样,如果您需要同步访问权限,逻辑将保留在FileReader

如果你需要让对象共享状态,那么通过将状态分解为另一个对象来使其显式化。