c ++检查基准引用的大多数派生类是否具有另一个基础

时间:2015-05-27 16:09:59

标签: c++ multiple-inheritance dynamic-cast

以下是我希望看到的行为示例代码:

// Example program
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>

class BaseA
{
public:
    BaseA() { };
};

class BaseB
{
public:
    BaseB() { };
};

class Derived1 : public BaseA
{
public:
    Derived1() : BaseA() { };
};

class Derived2 : public BaseA, public BaseB
{
public:
    Derived2() : BaseA(), BaseB() { };
};

int main()
{
    std::vector<BaseA *> collection_of_As{
        new Derived1{}, new Derived1{}, new Derived2{},
        new Derived2{}, new Derived1{}, new Derived2{}
        };

    for (BaseA * Aptr: collection_of_As) {
        BaseB * Bptr = dynamic_cast<BaseB *>(Aptr);

        std::cout << std::boolalpha << (Bptr != std::nullptr) << std::endl;
    }

    return 0;
}

但它不会编译,因为BaseA不是多态的,即使它的派生类最多也可以。我理解为什么这不起作用,但我仍然需要这种行为。有没有我可以得到这个编译&amp;工作

1 个答案:

答案 0 :(得分:4)

使BaseA多态。最简单的方法是给它一个虚拟析构函数。

class BaseA
{
public:
    virtual ~BaseA() {}
};

如果你想修复你的例子中的内存泄漏,你还是需要一个。