多态性和指针数组(C ++)

时间:2012-04-07 13:14:10

标签: c++ arrays inheritance pointers polymorphism

我有以下课程:容器元素,然后是来自Element的继承的几个类,例如。 按钮,输入等...

将元素添加到Container数组时遇到问题,我的main()看起来像这样:

Container c;
c.Add( Button(...) );
c.Add( Input(...) );

其中“...”是一些构造函数参数。

在容器类中,我有一个指针数组,用于存储属于该容器的所有元素:

Element ** elements;

但我遇到的问题是如何实现Add方法,我希望这样的东西可以工作:

void Add(const CControl & newElement){                      
    elements[elemCnt++] = &newElement;              
}

(分配元素数组:elements = new Element * [100];)

但是我收到了这个编译错误:

main.cpp: In member function ‘Container& Container::Add(const Element&)’:
main.cpp:138:23: error: invalid conversion from ‘const Element*’ to ‘Element*’

当我删除const限定符时,我收到编译错误,说没有合适的候选者。

问题是,我是C ++中多态和继承的新手,所以我可能会对此有所不妥。对此最好的方法是什么?

PS:主要方法看起来必须相同,也不建议任何向量或STL的东西。

2 个答案:

答案 0 :(得分:2)

Add应该使用指针:

void Add(CControl * newElement){                       
    elements[elemCnt++] = newElement;               
} 

然后你可以这样称呼它

c.Add( new Button(...) ); 
c.Add( new Input(...) ); 

如果你真的无法更改调用代码,则需要以某种方式创建临时副本。 例如。通过在CloneCControlInput中实施虚拟Button方法,并在Add中调用它。

void Add(const CControl & newElement){                        
    elements[elemCnt++] = newElement.Clone();
}

答案 1 :(得分:0)

如果不更改main,则无法修复此代码,因为您尝试存储对临时的引用。无论你做什么,这都是可以撤销的。