是否可以将指向子类的指针存储在基类的容器中
Is it ok to store pointer to a child class in a container to a base class
我有一个容器:
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)和一个私有(可能与对话相关)?
顺便说一句,我认为这是它的私人部分,导致你的错误:尝试更改为公共
相关文章:
- 无法将派生类存储在基类指针的向量中
- 将抽象派生类对象存储在基类向量中
- 将模板化对象指针存储在矢量中并通过基类指针进行访问
- 如何将指针存储在实例变量中,该指针被声明为指向基类的指针
- 在C 中的数组中存储抽象基类的不同派生类的对象
- 是否允许访问联合成员的公共基类,而不管存储的类型如何
- 来自存储在带有基类类型的地图中的派生类的调用函数
- 如何在派生类中存储基类初始化期间获得的信息
- 使用 a(n 空) 基类可以在同一容器中存储不同的对象
- 基类的C++数组,该数组的元素中存储有派生类的实例
- C++将类指针存储在可以从派生类访问的抽象基类中
- C++存储基类指针的向量
- C++是否有任何方法可以将一组派生类存储在基类的一个向量中,并仍然访问它们的成员
- C++将基类对象和派生类对象存储在一起
- 如何在基类中存储和执行派生类成员函数
- C++,使用基类指针存储子类和使用派生类方法的策略
- 将基类指针分配给在自由存储中创建的派生类对象
- 将派生类对象存储在基类变量中
- 是否可以将指向子类的指针存储在基类的容器中
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么