为什么我不能设置接口类的成员变量,如下所示

Cra*_*aig 2 c++ variables inheritance interface declaration

所以我有一个接口类

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
}
Run Code Online (Sandbox Code Playgroud)

以及从中继承的类.为什么我不能按如下方式设置接口类的成员变量.

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): m_interfaceVar(getInt){};
   ~inheritedClass(){};
}
Run Code Online (Sandbox Code Playgroud)

我必须这样做

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt){ m_interfaceVar = getInt;}
   ~inheritedClass(){};
}
Run Code Online (Sandbox Code Playgroud)

如果这是一个愚蠢的问题,我很抱歉,但是当我将我的抽象类转换为接口类(返回抽象类)时,我刚刚进入它.

Ecl*_*pse 6

到了inheritedClass它的初始化列表时,m_interfaceVar已经初始化了.你不能再次初始化它.

您可以选择为interfaceClass初始化提供构造函数m_interfaceVar,或者只是在inheritedClass构造函数的主体中赋值:

 interfaceClass(int getInt) : interfaceVar(getInt){}
 ...
 inheritedClass(int getInt) : interfaceClass(getInt)
 {
 }
Run Code Online (Sandbox Code Playgroud)

要么

 inheritedClass(int getInt)
 {
    m_interfaceVar = getInt;
 }
Run Code Online (Sandbox Code Playgroud)

  • C++中的抽象类没有什么特别之处,除了你不能直接创建一个实例.实际上,如果您不提供构造函数,编译器将为您填写一些内容. (2认同)
  • @Scott Smith:如果该类具有纯虚方法,则除了导出覆盖这些虚拟的类之外,它无论如何都无法实例化.现在,代码缺少的一件事是拥有受保护的析构函数或公共虚拟析构函数,具体取决于预期的用法. (2认同)

Ale*_*lli 6

构造函数中的初始化列表可以首先指定基类的ctor .通过剥夺interfaceClass(受保护的)构造函数(它显然应该具有),你已经切断了生命线.

所以添加那个受保护的ctor,例如:

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
    interfaceClass(int x) { m_interfaceVar=x; }
}
Run Code Online (Sandbox Code Playgroud)

并且然后,你可以做的事情以正确的方式,即

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): interfaceClass(getInt){};
   ~inheritedClass(){};
}
Run Code Online (Sandbox Code Playgroud)