C++ 将继承的类类型作为参数传递
我在将继承的类类型作为参数传递给采用其基类类型的方法时遇到了问题C++ 将继承的类类型作为参数传递,c++,inheritance,methods,C++,Inheritance,Methods,我在将继承的类类型作为参数传递给采用其基类类型的方法时遇到了问题 class Base {...} class Derived : public Base {...} class Container { vector<Base*> cont; //1 public: void addToCont(Base x) { //2 cont.push_back(&x); } } int main() { Container c;
class Base {...}
class Derived : public Base {...}
class Container {
vector<Base*> cont; //1
public:
void addToCont(Base x) { //2
cont.push_back(&x);
}
}
int main() {
Container c;
c.addToCont(Derived(p1,p2)); //3
}
与
这对我很有效
我的问题是我有3个派生类,我不想让add方法重载3次。我想我将不得不向这些类添加一些虚拟方法或类型转换,但我找不到任何相关内容。我是继承方面的新手,对此很困惑。感谢您的帮助。派生类只能在引用或指针时使用。如果在没有引用或指针的情况下将类转换为基类,则以后将无法将其用作派生类 如果您实际上是在容器中存储指针,那么我会将其显式化,因此:
class Container {
vector<Base*> cont;
public:
void addToCont(Base* x) {
cont.push_back(x);
}
~Container()
{
for(auto a : cont)
{
delete a;
}
}
}
总的来说:
容器c;
c、 添加到新派生的P1、p2
请注意,在您的原始代码中,Derivedp1、p2将在调用addToCont…之后再次被销毁,因此您的数组将指向派生类的死元素。这可能不是您真正想要的,因为使用该元素是未定义的行为,而构建一个装满无用元素的容器是毫无意义的
必须使用指向基的指针向量,以便可以处理层次结构中的对象。不用说,使用某种智能指针而不是原始指针可能会更好,但这取决于您的偏好和您对风险的热爱程度。
使用void addToContBase x是错误的,因为即使只是添加一个基对象,也会添加一个指向局部变量的指针,即pass by value参数
使用void addToContBase&x(使用本地派生的d的方式)也是错误的,原因与以前相同,只要d超出范围,指针中就会留下一个悬空指针
正在调用AddToContext。。。传递一个临时对象。在考虑内存管理时,必须考虑到这一点。
不确定为什么需要为所有派生类重载addToCont,这不是在void addToContBase&x上所做的
如果保留原始指针,解决方案是执行void addtoContebase*x,在那里可以将指针传递到Base或任何派生的。同样,您必须注意内存管理。您的派生对象可能需要分配一个新的派生对象。。。您必须注意谁拥有它,谁有责任删除它,例如,当容器对象被销毁时。
您可能应该记住将virtual设置为Base的析构函数,因为您将从基指针销毁派生对象,如果析构函数不是virtual,则只会部分销毁对象。
如果AddToContext是派生的。。。调用是绝对必需的,那么您可能需要考虑使用ValueAdtoTrasBaseX定义。但是,在将对象插入向量之前,必须克隆对象:
void addToCont(const Base &x) { //2
cont.push_back(x.clone());
}
但是。。您需要至少在派生类中实现一个virtual Base*clone const方法,该方法将生成一个具有派生对象精确副本的基指针,包括对象的额外副本和额外克隆…可能的副本请发布您的真实代码,不是这个充满语法错误和未声明标识符的伪代码段。请参阅复制摘要:您有未定义的行为,因为您正在存储指向临时对象的指针。我刚刚发现我应该能够为addToCont方法制作一个模板,我认为它会工作,那么你可能也不应该真正使用指针数组!那么我是否能够将所有派生对象存储在一个容器中?
class Container {
vector<Base*> cont;
public:
void addToCont(Base* x) {
cont.push_back(x);
}
~Container()
{
for(auto a : cont)
{
delete a;
}
}
}
void addToCont(const Base &x) { //2
cont.push_back(x.clone());
}