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

时间:2011-12-17 09:14:19

标签: c++ inheritance

我有一个容器:

QSet < QDialog*> dialogs_;  

我有几个继承自QDialog的Dialog,例如:

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)));
}

所以这就是行
 这给了我上面提到的错误

3 个答案:

答案 0 :(得分:1)

可以存储指向包含基类的容器中的派生类的指针。但是,你得到的是指向基类的指针。然后,您通常只会使用基类方法,或者使用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 _-&gt; insert()是指向基类的指针。 知道它总是指向一个类Dialog,但编译器没有,因为你从来没有说过它。试试这个:

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;
}

答案 1 :(得分:0)

这是你的函数内部代码:

return (*dialogs_->insert(new Dialog(caller,parent)));
        ^ // Returning Base class pointer

您的返回类型为Dialog *

因此,从Base TO Derived完成了一次转换,隐式转换在这里失败了。

尝试dynamic_cast到Dialog指针(来自QDialog指针),然后返回。

答案 2 :(得分:0)

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

对我来说有什么奇怪的,为什么你从2个类派生,一个公共(ok)和一个私人(可能是一个对话框)?

BTW我认为这是导致错误的私密部分:尝试改为公开。