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

标签 c++ arrays inheritance pointers polymorphism

我有以下类:ContainerElement 以及一些继承 的类,例如。 按钮、输入等...

我在向 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:主要方法必须看起来一样,也不要建议任何 vector 或 STL 东西。

最佳答案

Add应该拿一个指针:

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

那么你可以这样调用它

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

如果您确实无法更改调用代码,则需要以某种方式创建临时拷贝。 例如。通过实现虚拟 Clone CControl 中的方法, Input , ButtonAdd 中调用它.

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

关于c++ - 多态性和指针数组 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10054800/

相关文章:

javascript - 存储 JavaScript 构造函数供以后使用

c++ - 检查无用包含文件的工具是什么?(c++)

python - 使用键数组根据第一个元素按顺序拉取元素

java - 从字符串数组创建 Android 位置

javascript - 原型(prototype)链始终打印父方法

c++ - 如何从 cpp 文件修改 VS_VERSION_INFO

c++ - 为元组实现创建索引序列

c - 将 int 数组分配给 int 指针

c++ - 复制从抽象类派生的对象

c# - 不能继承Shapes