7

我的基类中有一个常量 int 变量,我想在派生类中用不同的值(作为参数)初始化响应变量,这可能吗?

这是我所做的:

// Base.h (methods implemented in Base.cpp in the actual code)
class Base {
    public:
        Base(const int index) : m_index(index) {}
        int getIndex() const { return m_index; }
    private:
        const int m_index;
};

// Derived.h
class Derived : public Base {
    public:
        Derived(const int index, const std::string name) : m_name(name) {}
        void setName(const std::string name) { m_name = name; }
        std::string getName() const { return m_name; }
    private:
        std::string m_name;
};

但显然它在问我Base::Base()哪个不存在,如果我定义它,我将不得不为 提供默认值m_index,这是我不想做的。我必须const int m_index在每个派生类中单独定义吗?

类似的问题,但我不确定静态是否会以任何方式影响这一点: C++:在派生类中使用不同的值初始化基类常量静态变量?

4

2 回答 2

18

只需在的初始化列表中调用适当的Base构造函数:Derived

Derived(const int index, const std::string name) : Base(index), m_name(name) {}
于 2012-11-27T19:50:09.377 回答
2

您可以像这样调用基本构造函数:

class B1 {
  int b;
public:    
  // inline constructor
  B1(int i) : b(i) {}
};

class B2 {
  int b;
protected:
  B2() {}    
  // noninline constructor
  B2(int i);
};

class D : public B1, public B2 {
  int d1, d2;
public:
  D(int i, int j) : B1(i+1), B2(), d1(i)
  {
    d2 = j;
  }
};

从 c++11 开始,您甚至可以使用同一类的构造函数。该功能称为委托构造函数。

Derived(){}
Derived(const int index, const std::string name) : Derived() {}
于 2012-11-27T19:51:35.067 回答