使用派生类成员的地址定义基类成员指针



请参阅我在下面的代码中所说的示例,在类 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;
};
我认为

您需要的是使print()Obj中的虚函数并在类ObjDerived中覆盖它。然后,您就不需要弄乱邪恶的原始指针。

我认为您的代码会出现的主要问题是,在 B 的构造函数中,您将尚未创建的变量传递给基类。

B()
    : A<T>( &o)
    , o( ObjDerived<T>( 1.0f))
{}

在构造函数中,命令按顺序执行,因此您将尚未创建的B::o传递给A::A然后创建B::o变量。

如果您真的想坚持使用此类结构,那么想到的唯一解决方案是将A::pObj设置为指向指针的指针,以便它可以通过首先转到B::o来访问新变量。然而,在我看来,这看起来非常混乱。

编辑:正如约翰史密斯所说,我认为你需要更多地研究使用虚函数和继承来整理类结构。

最新更新