C ++:与类同名的覆盖方法

时间:2016-07-14 20:54:42

标签: c++

让我们说我有一个漂亮的基类叫base

class base
{
public:
    virtual void foo() const = 0;
};

现在,我有一个名为foo的班级,我想继承base并覆盖base::foo

class foo : public base
{
public:
    virtual void foo() const override;
};

这在C ++中是非法的,因为不允许将方法命名为与类相同的东西(C ++贪婪地认为与类同名的方法是构造函数,不允许返回类型)。有没有什么方法可以不涉及更改类或方法的名称?我希望外部用户能够创建foo类,而不知道有其他人调用的方法base::foo(想象foo可以是名词和动词)。< / p>

4 个答案:

答案 0 :(得分:7)

  

有没有办法绕过这个不涉及更改类或方法的名称?

不,没有。

名为foo的所有方法在class foo中都很特殊 - 它们是构造函数。因此,它们不能被覆盖virtual成员函数。

答案 1 :(得分:4)

我会猜测一下,然后说

你可能在C ++中有很多含糊之处(有时候必须明确消除歧义),但我甚至没有看到编译器或程序员如何消除这种情况的歧义。好吧,程序员可以(具有返回类型的函数显然不是构造函数),但C ++不能。

答案 2 :(得分:1)

在C ++中,唯一可以拥有该类的方法是&#39; name是它的构造函数。 所以不行。你不能。

答案 3 :(得分:0)

好的,这是我的(有点邪恶的)解决方案......

// Create an intermediate class which actually implements the foo method:
class foo_intermediate : public base
{
public:
    virtual void foo() const override;
};

// Derive from that class and forward the constructor along
class foo : public foo_intermediate
{
public:
    using foo_intermediate::foo_intermediate;

private:
    friend class foo_intermediate;

    // Actual implementation for the foo function goes here
    void foo_impl() const;
};

// In some CPP file:
void foo_intermediate::foo() const
{
    // Need to access the typename foo via namespace (global here)
    static_cast<const ::foo*>(this)->foo_impl();
}

实际上调用 foo有点搞笑,因为这无效:

void bar()
{
    foo x;
    x.foo(); // <- illegal attempt to access to the foo constructor
}

必须通过别名访问:

void baz()
{
    foo x;
    base& rx = x;
    rx.foo(); // legal
}

作为替代方案,您可以使用typedef

class foo_impl : public base
{
public:
    virtual void foo() const override;
};

using foo = foo_impl;

这解决了调用x.foo()的问题,因为它不再显示为构造函数访问。

I made a Gist所以如果他们如此倾向,其他人可以使用这两种解决方案。