基类构造函数中指向派生类的指针
pointer to derived class in base class constructor
(注意,这是对我实际设计的过度简化)
class CParentA;
class C_Child
public:
C_Child(C_ParentB* parent) : m_parent(parent){};
virtual ~C_Child();
CParentB* m_parent;
};
class C_ParentA : public C_Child
{
public:
C_ParentA(C_GrandParent *gp) : C_Child(gp){};
virtual ~C_ParentA(){};
}
class C_ParentB
{
public:
C_ParentB(){};
virtual ~C_ParentB(){};
void foo(){};
}
class C_GrandParent : public C_ParentB, public C_ParentA
{
public:
C_GrandParent() : C_ParentA(this){};
virtual ~C_GrandParent();
}
main()
{
C_GrandParent gp;
gp.m_parent->foo();
}
似乎parentB
的指针,发送到子的构造函数,是无效的,但当祖父创建。我曾认为,即使父类没有完全构造,它的指针(this
)仍然是有效的。我还尝试让ParentB
是存储在grandparent
中的指针,并在grandparent
构造函数中动态创建对象。但这显然有相同的结果。
fww:这样做的目的是:grandparent
有许多parents
,其中一些与children
一起。一个child
可能需要访问另一个child
或parent
(uncle
/cousin
)。我原以为把他们都置于一个族长之下就能处理好家庭成员之间的大部分关系。尽管如此,设置合适的指针似乎是个问题。
首先,不清楚你在问什么,所以我只是想推测一下。你提出了一个不可行的设计,所以你一定是在寻求替代方案,但你没有给出你正在尝试做什么的信息。
其次,当类A
派生类B
时,我们通常说B
是基类或父类,A
是派生类或子类。你用了相反的术语,这很令人困惑。
现在,我只假设C_Child
中的CParentB* m_parent;
应该引用相同的C_Child
对象,视为CParentB
。你不需要为此存储指针。给定一个C_Child& r
引用或C_Child* p
指针,您可以简单地分别说
dynamic_cast<CParentB&>(r)
dynamic_cast<CParentB*>(p)
如果r,p
没有引用CParentB
对象,两者将以不同的方式失败。dynamic_cast
允许您浏览整个类层次结构,并在运行时检查强制转换是否有效。如果类不是多态的,可以使用static_cast
。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如果基类包含双指针成员,则派生类的构造函数
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 指向基类派生类的 std::unique_ptr 的指针
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 从基指针到派生的强制转换问题
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 从基类指针派生派生类的模板类型
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 访问通过指针派生的类
- 如果未使用虚拟函数,则使用基类指针派生类的任何目的
- 从基指针C++派生类的类型
- 无法从指针派生类转换为指针基类(多态性)
- C++ - 传递智能指针派生类