在向量C ++中从超类调用子类方法

切威特

我正在尝试将多个子类元素添加到向量中,以遍历它们的方式调用重写的方法,并希望它在可能的情况下调用重写的方法。但是我发现它似乎只在调用超类方法。

我学习了Java,但不确定为什么要用C ++做到这一点。我尝试使用超类的指针向量重写代码,并将子类的指针转换为超类。然后通过指针访问它。

理想情况下,我不想在矢量中放置一个指针列表,因为那样的话我就必须手动删除每个指针(我相信吗?)以防止内存泄漏,因为我将使用new创建对象,因此它们会通过方法调用而持久存在将它们添加到向量中。

有没有更好的方法可以做到这一点?还是在不需要父类时坚持使用指针并在创建的对象上调用delete?向量最好是X类的列表,而不是X类的指针的列表

我的结构是:

class a { vector vec of class X,
    method to create and add an instance of X into vector vec,
    method to create and add an instance of Y into vector vec }
class X { talk() }
class Y : public X { talk() }

代码演示了我理想的操作,但是仅通过调用超类方法来显示其损坏:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>

class A {
  public:
    virtual void talk() { printf("A\n"); }
};

class B: public A {
  public:
      void talk() { printf("B\n"); }
};

int main(void) {
    std::vector<A> vec;
    std::vector<A*> vec2;
    A a;
    B b;
    a.talk();
    b.talk();

    vec.push_back(a);
    vec.push_back(b);
    vec2.push_back(&a);
    vec2.push_back(&b);

    for(int i = 0; i < vec.size(); i++) {
        vec[i].talk();
        vec2[i]->talk(); //bad but short for example
    }

}
ps

要获得多态行为,您需要将说明virtual添加到要在派生类中重写的基类中的函数。

class A {
public:
    virtual void talk() { printf("A\n"); }
};

您还应该养成override在派生类中的重写函数上添加说明的习惯,以便编译器可以帮助您解决此类问题。

class B: public A {
public:
    virtual void talk() override { printf("B\n"); }
//                      ^ Compiler will report an error if base class' function
//                        is not virtual.
};

同样,您不能将派生的对象分配给基类的实例,否则会发生切片

std::vector<A> vec;
/* ... */
B b;
/* ... */
vec.push_back(b); // Slicing. Information only in B is lost.

使用virtual说明符的实时示例

没有virtual说明符的现场示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Objective-C中强制子类调用其超类方法

来自分类Dev

在C#中,子类对象如何直接调用被重写的超类方法?

来自分类Dev

在C ++中从指针向量访问子类变量到超类

来自分类Dev

如何检查目标C中的类级别方法是在超类中还是在子类中?

来自分类Dev

在C ++中,是否有可能在超类中有一个方法,当每个子类调用该方法时,该方法会向该子类返回一个shared_ptr?

来自分类Dev

在向量C ++的向量中删除向量

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

从基类C#调用子类方法

来自分类Dev

父类中子类的c ++调用方法

来自分类Dev

C ++-使指向超类的指针与函数中的子类参数匹配

来自分类Dev

在超类列表中查找子类成员。C#

来自分类Dev

C ++-使指向超类的指针与函数中的子类参数匹配

来自分类Dev

在超类列表中查找子类成员。C#

来自分类Dev

C ++类向量问题

来自分类Dev

在C ++类中引用向量

来自分类Dev

C ++中虚拟类的向量

来自分类Dev

当子类调用超类的方法时,如何获得超类来引用子类中的属性?

来自分类Dev

当参数是C ++中的父类类型时,如何调用子类的方法?

来自分类Dev

如何在C#的父类方法中调用子类的字段

来自分类Dev

C ++中的向量交集

来自分类Dev

在C ++中引用向量

来自分类Dev

C ++中的稀疏向量?

来自分类Dev

C ++中的稀疏向量?

来自分类Dev

C ++中的分割向量

来自分类Dev

C崩溃中的向量

来自分类Dev

超类引用无法在Java中调用子类方法

来自分类Dev

如何在Java中从超类调用子类方法?

来自分类Dev

您如何在Java中从超类调用子类方法?

Related 相关文章

热门标签

归档