V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dajj
V2EX  ›  问与答

C++ 类型转换问题

  •  
  •   dajj · 2019-10-03 12:49:58 +08:00 · 1238 次点击
    这是一个创建于 1877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    C++ 类型转换问题

    我有一个基类: Enemy , 由基类继承出了三个子类 Enemy1, Enemy2, Enemy3 每个子类都实现了自己的 echo 方法。 另外有一个函数
    void test (enemy) { enemy->echo(); }

    现在的问题是怎么通过回调给函数传递不同的子类。

    如果直接调用 test 方法的话, 可以通过 函数模版来实现。 但是通过回调,则涉及匿名函数, 匿名函数无法自动推导 模版函数的指针。 还有一种办法是将 enemy 的类型设置成 void * , 但是这样一来, 函数里面需要强制转换, 不知道是转换成哪个子类了。

    完整的代码如下

    #include <iostream>
    
    using namespace std;
    
    class Enemy
    {
    };
    
    class Enemy1:public Enemy
    {
        public:
            void echo()
            {
                cout<< "enemy1" << endl;
            }
    };
    
    class Enemy2:public Enemy
    {
        public:
            void echo()
            {
                cout<< "enemy2" << endl;
            }
    };
    
    class Enemy3:public Enemy
    {
        public:
            void echo()
            {
                cout<< "enemy3" << endl;
            }
    };
    
    
    class Test
    {
        public:
            template <typename t="">
                void echo (T* enemy)
                {
                    enemy->echo();
                }
    };
    
        int
    main()
    {
        auto enemy1=new Enemy1();
        auto enemy2=new Enemy2();
        auto enemy3=new Enemy3();
    
        //在此创建一个匿名回调函数
        //auto func = [](){};
        
        func(enemy1);
        func(enemy2);
        func(enemy3);
        return 0;
    }
    </typename></iostream>

    请问有什么好的解决办法

    lspvic
        1
    lspvic  
       2019-10-03 14:32:32 +08:00 via Android   ❤️ 1
    你的基类没有定义 echo 虚函数
    即使是匿名函数,也可以传递基类函数的参数,如 auto func = [](Enermy& e){}
    dajj
        2
    dajj  
    OP
       2019-10-04 09:27:29 +08:00
    解决了,没想到虚函数是干这个的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2348 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:54 · PVG 23:54 · LAX 07:54 · JFK 10:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.