让我们说我有一个漂亮的基类叫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>
答案 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所以如果他们如此倾向,其他人可以使用这两种解决方案。