Overloading virtual functions of the same name from different base classes. Is it possible? [duplicate]

孤街醉人 提交于 2019-12-01 00:11:08

问题


The title is probably confusing.

Suppose we have the following set up;

class A
{
public:
    virtual void fn() = 0;
};

class B
{
public:
    virtual int fn() {};
};

class C: public A, public B
{
};

Is there any way to define A::fn in class C?


回答1:


No. This is not possible. It will always conflict with either of the fn().

The syntax of fn() are different,

void fn();  // in A

and in B is,

int fn();  // in B

You have to make those syntax same in A and B to let C implement the fn(). Demo.




回答2:


There's no way in C to specify that one of the C::fn() implementations overloads A::fn() (and presumably another overloads B::fn()). What you can do, however, is introduce an intermediate class which “renames” the functions, something like:

class RemapA : public A
{
    virtual void fnInA() = 0;
public:
    virtual void fn()
    {
        fnInA();
    }
};

class RemapB : public B
{
    virtual int fnInB() = 0;
public:
    virtual int fn()
    {
        return fnInB();
    }
};

class C : public RemapA, public RemapB
{
    virtual void fnInA() { /* ... */ }
    virtual void fnInB() { /* ... */ }
    //  ...
};



回答3:


You might want to read my answer to the following question: Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes In short: Yes, with some restrictions on calling it. It can be called as an A (pointer or reference) or a B (pointer or reference), but not as a C, as that would be ambiguous.



来源:https://stackoverflow.com/questions/7319494/overloading-virtual-functions-of-the-same-name-from-different-base-classes-is-i

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!