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)
如果这是一个愚蠢的问题,我很抱歉,但是当我将我的抽象类转换为接口类(返回抽象类)时,我刚刚进入它.
到了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)
构造函数中的初始化列表可以首先指定基类的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)