首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:访问虚拟方法

C++:访问虚拟方法
EN

Stack Overflow用户
提问于 2012-12-12 21:49:24
回答 4查看 232关注 0票数 3

我正在尝试使用虚方法表在类中按索引调用函数...假设我们有以下代码:

代码语言:javascript
复制
class Base
{
public:
    Base() {}
    virtual ~Base() {}

    virtual Base* call_func(unsigned int func_number)
    {
       // Some way to call f_n
    }
protected:
    virtual Base* f_1() const = 0;
    virtual Base* f_2() const = 0;
    virtual Base* f_3() const = 0;
};

我已经使用函数数组if-statement和case-statement实现了这一点...那么,有没有一种更好的方法来只使用指针(例如访问vtable )或类似的东西来调用方法呢?

为我糟糕的英语道歉:并提前感谢!

编辑:感谢您的建议!我将扩展我的问题:

在解决这个问题之后,我将使用f_1、f_2、f_3的不同实现创建派生类(例如derived1和派生2),并拥有一个如下所示的类控件:

代码语言:javascript
复制
class Control
{
protected:
    Base* current;

public:
    Control(Base* curr = new derived1): current(curr) {}
    virtual ~Control() 
    {
        delete current;
    }
    virtual void do_something(unsigned int func_numb)
    {
        delete current
        Base* new = current->next_state(stl);
        current = new;
    }
};
EN

回答 4

Stack Overflow用户

发布于 2012-12-12 21:54:25

switch语句:

代码语言:javascript
复制
switch (func_number)
{
    case 1:
        f_1();
        break;
    case 2:
        f_2();
        break;
    case 3:
        f_3();
        break;
}

或者使用函数指针数组。

票数 1
EN

Stack Overflow用户

发布于 2012-12-12 22:13:16

没有可移植的方法来访问虚拟函数表;语言规范没有指定应该如何实现虚拟分派,因此甚至没有要求表必须存在,更不用说程序可以访问了。

没有比您提到的方法更好的方法了:函数指针表或if/switch条件。

票数 1
EN

Stack Overflow用户

发布于 2012-12-12 22:56:31

我假设你只是想找到所有可能的方法来解决它。

您可以使用指向成员函数的指针的map (或vector),并将其初始化一次(在构造函数中或静态地)。它可以模仿vtable。

这些字里行间的东西:

代码语言:javascript
复制
class Base
{
public:
    Base() {
        functions.insert(std::make_pair(1,&Base::f_1));
        functions.insert(std::make_pair(2,&Base::f_2));
        functions.insert(std::make_pair(3,&Base::f_3));
        }
    virtual ~Base() {}
    virtual Base* call_func(unsigned int func_number)
    {
    return (this->*functions[func_number])();
}
protected:
    std::map<unsigned int, Base*(Base:: *)()const> functions;
virtual Base* f_1() const = 0;
virtual Base* f_2() const = 0;
virtual Base* f_3() const = 0;

};

即使对于继承的类,这也应该有效(不过,我会将call_func设为非虚拟的)。是的,你应该检查项目是否真的在地图(或矢量)中,以及它是否不是一个nullptr

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13841248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档