是否可以将指向子类的指针存储在基类的容器中

Is it ok to store pointer to a child class in a container to a base class

本文关键字:存储 基类 指针 是否 子类      更新时间:2023-10-16

我有一个容器:

QSet < QDialog*> dialogs_;  

和我有几个对话框继承自QDialog,所以例如:

class _1_Dialog : public QDialog, private Ui::_1_Dialog
{};  
class _2_Dialog : public QDialog, private Ui::_1_Dialog
{};  

,我想在我的'dialogs_'成员var中存储这些对话框的指针,但现在我得到错误:

error: invalid conversion from 'QDialog*' to '_1_Dialog*' [-fpermissive]  

在这种情况下使用-fpermissive可以吗?还是说这是个坏主意?
编辑:
我有一个名为create_的fnc在它的主体中有一个语句:

    template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
    return (*dialogs_->insert(new Dialog(caller,parent)));
}

这一行是
这给了我前面提到的错误

可以将指向派生类的指针存储在保存基类的容器中。然而,你从中得到的是一个指向基类的指针。然后,通常要么只使用基类方法,要么使用dynamic_cast来检查它的实际类型。

template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
    return (*dialogs_->insert(new Dialog(caller,parent)));
}

*dialogs_->insert()是指向基类的指针。知道它总是指向一个类对话框,但是编译器不知道,因为你从来没有告诉过它。试试这个:

template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
    Dialog* result = new Dialog(caller,parent);
    dialogs_->insert(result);
    return result;
}

这是你的代码内部函数:

<>之前return (*dialogs_->insert(new Dialog(caller,parent));^//返回基类指针之前

返回类型为Dialog *

因此,从Base TO Derived进行了强制转换,这里的隐式强制转换失败了。

尝试dynamic_cast对话指针(从QDialog指针),然后返回。

我还没有(尚未)尝试编写任何特定于您的问题的代码,但从架构的角度来看,您的情况是最常见和最明显的面向对象的GUI应用程序:任何Widget(例如)它是Widget的容器(即一些更具体的GUI元素的基类)…

对我来说很奇怪,为什么你从2个类中派生,一个公共(ok)和一个私有(可能与对话相关)?

顺便说一句,我认为这是它的私人部分,导致你的错误:尝试更改为公共