我正在编写一个表达式解析库。
它是用Qt编写的,我有这样的类结构:
QCExpressionNode
- 表达式的所有部分的抽象基类
QCConstantNode
- 表达式中的常量(扩展QCExpressionNode
)
QCVariableNode
- 表达式中的变量(扩展QCExpressionNode
)
QCBinaryOperatorNode
- 二进制加法,减法,乘法,除法和幂运算符(扩展QCExpressionNode
)
我希望能够使用智能指针(例如QPointer
或QSharedPointer
),但我遇到了以下挑战:
- 一个QPointer
可以用于抽象类吗?如果是,请提供示例
- 如何将QPointer
强制转换为具体的子类?
答案 0 :(得分:3)
我认为你没有理由不这样做。举个例子:
class Parent : public QObject
{
public:
virtual void AbstractMethod() = 0;
};
class Child: public Parent
{
public:
virtual void AbstractMethod() { }
QString PrintMessage() { return "This is really the Child Class"; }
};
现在初始化一个QPointer,如下所示:
QPointer<Parent> pointer = new Child();
然后,您可以像通常使用QPointer一样调用'abstract'类上的方法
pointer->AbstractMethod();
理想情况下,这就足够了,因为您可以使用父类中定义的抽象方法访问所需的所有内容。
但是,如果您确实需要区分子类或使用仅存在于子类中的内容,则可以使用dynamic_cast。
Child *_ChildInstance = dynamic_cast<Child *>(pointer.data());
// If _ChildInstance is NULL then pointer does not contain a Child
// but something else that inherits from Parent
if (_ChildInstance != NULL)
{
// Call stuff in your child class
_ChildInstance->PrintMessage();
}
我希望有所帮助。
额外注意:您还应该检查pointer.isNull()以确保QPointer实际包含某些内容。