具有多重继承C++ dynamic_cast

C++ dynamic_cast with multiple inheritance

本文关键字:cast dynamic C++ 多重继承      更新时间:2023-10-16

可以使用多重继承通过dynamic_cast获取对象吗?由于我遇到的设计问题,我更喜欢跳过构图技巧。谢谢

#include <stdio.h>
namespace
{
    template <typename T>
    class Beta
    {
    protected:
        Beta() { printf("Betan"); }
    public:
        virtual ~Beta() { printf("~Betan"); }
        virtual void Run() = 0;
    };
    class Alpha
    {
    protected:
        Alpha() { printf("Alphan"); }
    public:
        virtual ~Alpha() { printf("~Alphan"); }
        virtual void Check() = 0;
        template <typename T>
        Beta<T>* GetBeta()
        {
            Beta<T>* b = dynamic_cast< Beta<T>* >(this);
            if(b == NULL) printf("NULL !!n");
            return b;
        }
    };
    template <typename T>
    class Theta : public Alpha, Beta<T>
    {
    public:
        void Run()
        {
            printf("Run !n");
        }
        void Check()
        {
            printf("Check !n");
        }
    };
}
int main(int argc, const char* argv[])
{
    Alpha* alpha = new Theta<int>();
    Beta<int>* beta = alpha->GetBeta<int>();
    alpha->Check();
    if(beta) beta->Run();
    delete alpha;
    return 0;
}

上述代码的结果是

阿尔法试用版零!!检查!~试用版~阿尔法

好吧,如果我替换:

public Alpha, Beta<T>

跟:

public Alpha, public Beta<T>

事情会好起来的。细节中总有魔鬼...