请参阅下面的代码,在B类中看到我正在谈论的内容的示例。 我做错了什么,记忆明智吗?
我遇到了之前我没有的分段错误...
class Obj
{
};
class ObjDerived : public Obj
{
};
template <typename T>
class A
{
public:
Obj<T> *pObj;
public:
A(Obj<T>* pO) : pObj(pO) {}
void doSomethingWithObj()
{ pObj->print(); }
};
template <typename T>
class B : public A<T>
{
public:
B() : A<T>(&o), o(ObjDerived<T>(1.0)) {}
void doSmthg()
{ (this->pObj)->print(); }
public:
ObjDerived<T> o;
};
答案 0 :(得分:1)
我认为您需要的是让print()
成为课程Obj
中的虚拟函数,并在课程ObjDerived
中覆盖它。然后你不需要乱用邪恶的原始指针。
答案 1 :(得分:0)
我认为代码可能出现的主要问题是,在B
的构造函数中,您将一个尚未创建的变量传递给基类。
B()
: A<T>( &o)
, o( ObjDerived<T>( 1.0f))
{}
在构造函数中,命令按顺序执行,因此您将尚未创建的B::o
传递给A::A
,然后创建B::o
变量。
想到的唯一解决方案,如果你真的想坚持这个类结构,那就是让A::pObj
成为指针的指针,这样它就可以先访问{{1 }}。然而,在我看来,这看起来非常混乱。