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;
}
编译器说明子类没有任何父字段。
编译:
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'
我在谷歌搜索但我找不到答案: Thx提前
答案 0 :(得分:6)
您无法直接在派生类构造函数中构造函数初始化基本成员变量。
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
{
}
你可以在基础构造函数中默认构造它们,然后分配它们(因为它们受到保护)
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
}
或者您可以修改父类构造函数
BaseClass( A* aAptr, B * aBPtr0, C* aCPtr)
: mAPtr(aAptr)
, mBPtr(aBPtr)
, mCPtr(aCPtr)
{
}
和
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
: BaseClass(aAptr, aBPtr, aCPtr)
{
}
另外,请记住,您需要在派生类
中定义void init()方法答案 1 :(得分:5)
您无法在派生类的构造函数的初始化列表中初始化基类的数据成员。您可以在构造函数的主体中分配它们:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0) {
mAPtr = aAptr;
mBPtr = aBPtr;
mCPtr = aCPtr;
}
但是,基类看起来设计得很糟糕:它的唯一构造函数根本不初始化三个数据成员(甚至不是NULL
),因此它们最终包含随机垃圾。在BaseClass
中有一个初始化数据成员的三参数构造函数可能是有意义的; ChildClass
的构造函数只需通过其initialzier列表转发给它。
答案 2 :(得分:2)
Juan,这段代码:
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;
}
答案 3 :(得分:1)
使用上面的anwser,我改变了一点:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
this->mAPtr=aAptr;
this->mBPtr=aBPtr;
this->mCPtr=aCPtr;
}
如果没有this指针,编译器就不会看到父变量。 Thx!,顺便说一下编译是为了Linux使用gcc编译器gcc 4.7.3版。