C++ 派生类模板没有';看不到基类';s成员
我正在开发一个派生自另一个类的类,但我被以下代码卡住了:C++ 派生类模板没有';看不到基类';s成员,c++,C++,我正在开发一个派生自另一个类的类,但我被以下代码卡住了: template <class A, class B, class C> class BaseClass { public: BaseClass(){} virtual void amethod( A* aPtr=0) { mAPtr=aPtr; } virtual void init()=0; protected: A * mAPtr; B* mBPtr
template <class A, class B, class C>
class BaseClass
{
public:
BaseClass(){}
virtual void amethod( A* aPtr=0)
{
mAPtr=aPtr;
}
virtual void init()=0;
protected:
A * mAPtr;
B* mBPtr;
C * mCPtr;
};
template <class A,class B,class C>
class ChildClass: public BaseClass<A,B,C>
{
public:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0):mAPtr(aAptr)
,mBPtr(aBPtr)
,mCPtr(aCPtr)
{}
};
int main()
{
return 0;
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
mAPtr = aAptr; // <-- Member belongs to parent but you can access it
mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
模板
类基类
{
公众:
基类(){}
虚空法(A*aPtr=0)
{
mAPtr=aPtr;
}
虚拟void init()=0;
受保护的:
A*mAPtr;
B*mBPtr;
C*mCPtr;
};
模板
类ChildClass:公共基类
{
公众:
ChildClass(A*aAptr=0,B*aBPtr=0,C*aCPtr=0):mAPtr(aAptr)
,mBPtr(aBPtr)
,mCPtr(aCPtr)
{}
};
int main()
{
返回0;
}
编译器指出子类没有任何父字段
编译器输出:
In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
error: class 'ChildClass<A, B, C>' does not have any field named 'mAPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mBPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mCPtr'
构造函数“ChildClass::ChildClass(A*,B*,C*)”中的
在构造函数“ChildClass::ChildClass(A*,B*,C*)”中
错误:类“ChildClass”没有任何名为“mAPtr”的字段
错误:类“ChildClass”没有任何名为“mBPtr”的字段
错误:类“ChildClass”没有任何名为“mCPtr”的字段
我在谷歌上搜索过,但找不到答案:
Thx预先您不能初始化基类“派生类”构造函数的初始值设定项列表中的数据成员。您可以在构造函数的主体中分配它们:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0) {
mAPtr = aAptr;
mBPtr = aBPtr;
mCPtr = aCPtr;
}
然而,基类看起来设计得很糟糕:它唯一的构造函数根本没有初始化三个数据成员(甚至没有初始化为
NULL
),因此它们最终包含随机垃圾。在BaseClass
中使用三参数构造函数来初始化数据成员可能是有意义的;ChildClass
的构造函数只需通过其initialzier列表转发到该类。构造函数不能直接在派生类构造函数中初始化基成员变量
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
: mAPtr(aAptr) // <-- Member belongs to parent
, mBPtr(aBPtr) // <-- Member belongs to parent
, mCPtr(aCPtr) // <-- Member belongs to parent
{
}
及
另外,请记住,您需要使用上面的anwser在派生类中定义void init()方法,我做了一些更改:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
this->mAPtr=aAptr;
this->mBPtr=aBPtr;
this->mCPtr=aCPtr;
}
如果没有this指针,编译器将看不到来自父级的变量。
谢谢!,顺便说一下,编译是针对Linux的,使用Gcc编译器Gcc版本4.7.3。Juan,以下代码:
template <class A, class B, class C>
class BaseClass
{
public:
BaseClass(){}
virtual void amethod( A* aPtr=0)
{
mAPtr=aPtr;
}
virtual void init()=0;
protected:
A * mAPtr;
B* mBPtr;
C * mCPtr;
};
template <class A,class B,class C>
class ChildClass: public BaseClass<A,B,C>
{
public:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0):mAPtr(aAptr)
,mBPtr(aBPtr)
,mCPtr(aCPtr)
{}
};
int main()
{
return 0;
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
mAPtr = aAptr; // <-- Member belongs to parent but you can access it
mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
ChildClass(A*aAptr=0,B*aBPtr=0,C*aCPtr=0)
{
mAPtr=aAptr;//我不确定,但可能无法使用构造函数初始值设定项初始化继承的字段。请尝试在构造函数的主体中初始化它们。(顺便问一下,STL与此问题有什么关系?)Visual Studio 2012完美地编译了这段代码。就像@MatteoItalia一样,我想知道STL与此有什么关系。我编辑了这个问题,以反映问题主体中的内容。请添加有关如何涉及STL的详细信息,如果它真的涉及:)@Helix,那么这是VS2012中的一个bug
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
mAPtr = aAptr; // <-- Member belongs to parent but you can access it
mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
BaseClass<A,B,C>::mAPtr = aAptr;
BaseClass<A,B,C>::mBPtr = aBPtr;
BaseClass<A,B,C>::mCPtr = aCPtr;
}