首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态绑定子类函数

动态绑定子类函数
EN

Stack Overflow用户
提问于 2016-09-05 01:43:53
回答 4查看 374关注 0票数 1

考虑下面的代码:

代码语言:javascript
复制
class Bas
{
    public:
        virtual void test() = 0;
};
class Sub : public Bas
{
    public:
        void test(){};
        void subfunc(){};
};
int main()
{
    Bas * bs = new Sub();
    bs->test();
    bs->subfunc(); //Gives error
    return 0;
}

为什么不能在这里使用多态性?我的意思是,对象bs是Bas和Sub类型的,为什么只能使用Bas中的函数?

EN

回答 4

Stack Overflow用户

发布于 2016-09-05 01:46:24

你只能获得那些你在基类中使用基类指针定义的函数。你的基类没有subfunc(),这就是你出错的原因。下面的代码可能对你有用

代码语言:javascript
复制
class Bas
{
public:
    virtual void test() = 0;
    virtual void subfunc(){};
};

class Sub : public Bas
{
public:
    void test(){};
    void subfunc(){};
};

int main()
{
    Bas * bs = new Sub();
    bs->test();
    bs->subfunc();
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-05 01:47:06

多态不适用于subfunc,因为它不是基类中的虚方法。

Polymorphism (subtyping in this case)仅适用于在基类中被重写的虚方法。编译器向具有该虚方法的每个类添加一个vtable,以便在运行时调用正确的方法(请参见virtual method table)。

向Bas类添加一个没有实现的虚拟子函数。

代码语言:javascript
复制
 class Bas
{
    public:
        virtual void test() = 0;

        virtual void subfunc() = 0; //add this
};
票数 0
EN

Stack Overflow用户

发布于 2016-09-05 01:51:58

main函数中,已知bs的类型为Bas

如果您希望编译器利用它也具有类型Sub (例如调用subfunc),您可以在确保bs确实具有类型Sub的方法的条件下将bs向上强制转换为类型Sub

代码语言:javascript
复制
class Bas
{
    public:
      virtual void test() = 0;
      virtual bool isSub() const { return false; }
};
class Sub : public Bas
{
    public:
      void test(){};
      virtual bool isSub() const { return true; }
      void subfunc(){};
};
int main()
{
    Bas * bs = new Sub();
    bs->test();
    if (bs->isSub()) {
      assert(dynamic_cast<const Sub*>(bs));
      static_cast<Sub*>(bs)->subfunc();
    }
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39319758

复制
相关文章

相似问题

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