c++ - C++ 中指针的运行时多态性

标签 c++ polymorphism radix runtime.exec derived

我遇到了 C++ 中运行时指针分配的问题。我有一个 具有 2 个成员线程和线程的 base 类。

class base {

    struct base_struct {
        int a;
    };
    base_struct thread;
    std::vector<base_struct> threads;

    void fn () {}

};

provided1 派生自 base 并具有相同的两个成员(thread线程)但类型不同。

class derived1 : public base {
    struct derived_struct11 : public base_struct {
        int b;
    };
    derived_struct11 thread;
    std::vector<derived_struct11> threads;

    void fn () {
        printf();
    }

};

衍生2也是从base派生的,并且具有相同的两个成员(thread线程),但类型不同。

class derived2 : public base {
    struct derived_struct22 : public base_struct {
        int c;
    };
    derived_struct22 thread;
    std::vector<derived_struct22> threads;

    void fn () {
        printf();
    }

};

只有在运行时我才能知道是否应该使用衍生1衍生2。所以我 通过以下方式做到了:

base base_obj;
derived1 derived1_obj;
derived2 derived2_obj;

base *ptr ;

在运行时函数中:

{
    if (condition == yes)
        ptr = &derived1_obj;

    else
        ptr = &derived2_obj;
}

问题是我可以使用 this 指针直接访问函数。但 线程的值(例如:threads.size() 始终显示为base 类。

我想知道一些更好的方法来实现这个。

最佳答案

直接的问题是数据成员不能是虚拟的,所以你不能覆盖 threads在派生类中。一种解决方案可能是只有一个 threads在基类中,并将所有结构实例存储在其中。

但是,您会遇到切片问题:您正在按 std::vector<base_struct> 中的值存储对象。 。这意味着每当您将一个对象放入其中时,它都会使用 base_struct 的(生成的)复制构造函数复制到 vector 中。 。这意味着原始对象的派生部分将被切掉,你只会得到一个 base_struct元素。

要启用多态性,您应该仅存储指向 base_struct 的指针在你的 vector 中:

std::vector<base_struct*> threads;

另一种方法是为 threads 提供虚拟 getter ,然后您可以在派生类中重写它以返回所需的集合。然而,在类层次结构中拥有多个同名的数据成员在我看来并不是一个好主意。它可能会让人们感到困惑并导致微妙的错误。因此,我更喜欢第一个解决方案,除非有非常紧迫的理由在每个类中保留单独的集合。

关于c++ - C++ 中指针的运行时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598841/

相关文章:

Java - 线程基数排序

python - Python中用一个字符表示多个值

c++ - Matlab 到 C++ 代码转换

c++ - 从二进制补码转换为十进制

c++ - 如何处理 RAII 的构造函数失败

c++ - 指向派生类对象的基类指针有哪些用例

c++ - 通过非虚方法进行多态调用

c++ - 为什么 valgrind 在没有内存泄漏的情况下会在这里看到内存泄漏

c++ - 如果系统处于事件状态,如何检查 C++?

c++ - cv::Mat 中 cv::Point 的 OpenCV rgb 值