如下:
class A : public B{
public:
//
A(bool Mem = false) : B(bUserEnableMem)
{}
//1、B(Parent, Mem)为什么构造函数当中都是用了子类A构造函数的参数来初始化父类B?
//2、这个的意思是用子类参数来初始化父类?
A(A *Parent, bool Mem = false) :B(Parent, Mem)
{
A *lpKpmsBase = dynamic_cast<A*>(Parent);
if(lpKpmsBase != NULL)
m_SystemParam = lpKpmsBase->m_SystemParam;
}
public:
CSystemParam m_SystemParam;
};
对于1,如果父类的构造函数带有参数,子类在初始化时调用该构造函数的时候带有这些参数,否则无法调用父类的构造函数。
对于2,答案是肯定的。
值得注意的是,构造函数的调用顺序:
调用基类的构造函数,调用顺序按照他们被继承时声明的基类名的顺序
调用内嵌对象的构造函数,调用顺序按各个对象在派生类内声明的顺序
执行派生类构造函数体中的内容
另外,我不知道使用这句话的目的
A *lpKpmsBase = dynamic_cast<A*>(Parent);
lpKpmsBase和Parent不都是class A的对象吗?为什么需要强制转换?
A中并没有虚函数,这样转换编译器会报错的吧
还有这个
A(A *Parent, bool Mem = false) :B(Parent, Mem)
{};
class B的构造函数中有其子类A的对象Parent,是你写错了吗?Parent应该是父类B的对象?
追问哦,这个问题已经解决,不过还是谢谢你写了这么多。
另外,B类型的参数可以给传递成A类型的,这应该是多态的机制,比如我们可以让父类对象的指针指向子类对象,给父类型的引用引用子类对象。
A *lpKpmsBase = dynamic_cast(Parent)这样的强制转换是没有必要的,因为Parent你已经声明为class A的对象,并且dynamic_cast是一种不推荐的转换方式,因为如果A没有虚函数,编译器会报错。
最为重要的是B(父类)的参数传递成A(子类)的类型是有很大风险的!!多态是使用父类的接口调用子类的方法,是向上转换,不是向下。通常来讲使用指针向上强制转换(用父类指针指向子类数据块)是较为安全的,而向下转换是比较危险的方法(Effective C++)