从不同的基类重载同名的虚函数。是否可以?

发布于 2024-12-02 22:28:01 字数 247 浏览 2 评论 0原文

标题可能令人困惑。

假设我们有以下设置;

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

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

class C: public A, public B
{
};

有没有办法在class C中定义A::fn

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南汐寒笙箫 2024-12-09 22:28:01

C 中无法指定 C::fn() 之一
实现重载 A::fn() (大概还有另一个重载
B::fn())。然而,你可以做的是引入一个中间层
“重命名”函数的类,例如:

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() { /* ... */ }
    //  ...
};

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() { /* ... */ }
    //  ...
};
独夜无伴 2024-12-09 22:28:01

。这是不可能的。它总是与 fn() 中的任何一个发生冲突。

fn() 的语法不同,

void fn();  // in A

B 中,

int fn();  // in B

您必须使 AB< 中的语法相同/code> 让 C 实现 fn()演示

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.

猫弦 2024-12-09 22:28:01

您可能想阅读我对以下问题的回答:由于多个抽象基类,实现两个同名但不同、非协变返回类型的函数
简而言之:是的,但调用它有一些限制。它可以被称为 A(指针或引用)或 B(指针或引用),但不能被称为 C,因为那样会产生歧义。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文