首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11多态性:从基类指针调用派生类方法

C++11多态性:从基类指针调用派生类方法
EN

Stack Overflow用户
提问于 2022-01-04 19:13:26
回答 1查看 249关注 0票数 0

总之,我认为我的问题的答案是否定的。然而,我会有希望,服从那些比我聪明的人。

我想从指向基类的指针调用派生类的类方法。重载并希望被调用的继承方法是纯虚拟的。我能够让它在某些情况下工作,但不能在特定情况下工作,在这种情况下,纯虚拟方法包含参数的省略占位符。

我想要的东西的本质贴在下面,任何修正和/或建议都非常感谢,谢谢。

代码语言:javascript
复制
    #include <iostream>

    class A
    {
        public:
            virtual void setup()=0;
            virtual void callFunction(std::string str, ...)=0;
    };

    class B: public A
    {
        public:
            virtual void setup() {};        
            virtual void callFunction(std::string str, ...) { std::cout<<"\nB::callFunction("<<str<<")\n"; }; //compiles: not desired: a->callFunction("Hello World", 987); executes as B::callFunction
            //virtual void callFunction(std::string str, ...)=0; compile error: error: cannot declare variable 'c' to be of abstract type 'C'
    };

    class C: public B
    {
        public:
            void setup() { std::cout<<"\nC::setup\n"; };
            void callFunction(std::string str, int i) { std::cout<<"\nC::callFunction("<<str<<") = "<<i<<"\n"; };
    };

    int main()
    {          
        C c;
        A* a = (A*) new C;
        
        c.setup();
        c.callFunction("Hello World", 123);
        
        a->setup(); //WHY: does this pure virtual function still execute C::setup, this is desired for pure virtual method callFunction derived from class A
        a->callFunction("Hello World", 987);
        
        return 0;
        
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-04 19:45:47

作为评论的结论:

不能通过重载派生类中的虚拟函数来影响虚拟分派。

过载分解和虚拟调度是正交的,前者发生在后者之前。

因此,您可以做的是声明多个重载,这些重载实际上是单独分派的。

在您的问题中,这只需要将int重载作为纯虚拟添加到A中。

代码语言:javascript
复制
class A
{
    public:
        virtual void setup()=0;
        virtual void callFunction(std::string, ...)=0;
        virtual void callFunction(std::string, int)=0;
};

为了确保虚拟函数实现与这些重载正确匹配,您应该将override说明符添加到派生类中的所有实现中,例如:

代码语言:javascript
复制
void callFunction(std::string str, int i) override { std::cout<<"\nC::callFunction("<<str<<") = "<<i<<"\n"; };

如果您需要支持更多的参数类型,只需将另一个纯虚拟重载添加到A中,并在继承层次结构中实现它。

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

https://stackoverflow.com/questions/70583910

复制
相关文章

相似问题

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