c++ - 从 vector C++ 中的父类(super class)调用子类方法

标签 c++ pointers inheritance vector superclass

我正在尝试将一些子类元素添加到一个 vector 中,遍历它们调用一个被覆盖的方法,并希望它在可能的情况下调用被覆盖的方法。但是我发现它似乎只调用父类(super class)方法。

我学过 Java,但不确定为什么要在 C++ 中这样做。我尝试使用父类(super class)的指针 vector 重写代码并将子类的指针转换到父类(super class)。然后通过指针访问它。

理想情况下,我不想将指针列表放入 vector 中,因为我必须手动删除每个指针(我相信?)以阻止内存泄漏,因为我将使用 new 创建对象,以便它们持续到方法调用以将它们添加到 vector 中。

有没有更好的方法来做到这一点,或者我是否坚持使用指针并在不需要父类时对创建的对象调用 delete? vector 最好是 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() }

演示我理想中想要做的事情的代码,但仅通过调用父类(super class)方法就显示出它的错误:

#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
    }

}

最佳答案

要获得您想要的多态行为,您需要将 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.
};

此外,您不能将派生对象分配给基类的实例,或者 slicing will occur .

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

Live example using virtual specifier

Live example without virtual specifier

关于c++ - 从 vector C++ 中的父类(super class)调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844084/

相关文章:

c++ - 范围和分解的原因不允许constexpr

c++ - 范围界定错误并且不能有 cv 限定符?

C++ 获取 64 位应用程序的模块基址

C++ : get inherited type from abstract pointer vector

pointers - Go中的指针与值接收器| heap.Interface vs sort.Interface

c++ - findcontours 断言失败

c++ - try-catch block 可以在 LLVM/MSVC 上编译吗?

c - 使用 malloc 分配的 block 地址

c# - 泛型继承 c#

java - 有没有办法在匿名类中初始化最终字段?