我想重写一个QWidget的虚函数,但不想通过继承来实现。在Java中是可以做到的,我找到了这个链接:overriding methods without subclassing in Java。不确定在C++中是否也有类似的方法。有什么想法吗?
没有继承就不能重写方法。链接的示例代码确实使用了子类。也许混淆是因为它没有使用extends
关键字。它创建了一个XStream
的匿名子类并重写了它的方法。这种类在C++中也存在,类似的代码也是可以实现的。命名约定有点不同。没有名称但具有命名实例的类称为未命名†。以下是我对代码的转译,展示了如何使用C++中的未命名类来完成该示例:
class SomeClass {
public:
void myMethod() {
class: public XStream {
protected:
MapperWrapper wrapMapper(const MapperWrapper& next) override {
return MapperWrapper(next); // the example is cut off here, persumably it's creating another nested anonymous class, but i'll keep this simple
}
} xstream;
}
};
如果您想以这种方式覆盖它,可以使用 QWidget
替换 XStream
和 wrapMapper
的虚拟类之一。
在Java中,匿名类通常用于回调。但是在C++中,我们有函数指针和最近的lambda表达式,这可能是为什么在C++代码中使用无名类的情况比Java少得多的原因。此外,在c++11之前,无名类不允许作为模板参数,因此它们将是回调函数对象的一个不良选择。
† 在C++中,匿名 类(或结构)将没有命名实例。它可以是另一个外部类的成员,并且匿名类的成员将带到父类的命名空间中。但是,匿名类不被标准允许。那么怎么会有这种东西的定义呢?嗯,匿名联合是被允许的,而匿名类与之类似。匿名结构体由C11标准允许。
@Override
关键字只是一种诊断工具:如果该方法没有覆盖超类,则会发出错误。 删除 @Override
对生成的代码没有影响。C++11 也有这个功能 -- 参见此链接。