我想覆盖QWidget的虚函数而不进行子类化。它可以在java中。我找到了这个链接:
overriding methods without subclassing in Java
不确定c ++中是否也有方法。有什么想法吗?
答案 0 :(得分:11)
您无法在不继承的情况下覆盖。链接示例中的代码确实是子类。也许混淆来自它没有使用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;
}
};
如果您想以这种方式覆盖XStream
,可以将QWidget
替换为wrapMapper
和{{1}}其中一个虚拟类。
匿名类通常用于Java中的回调。但是在C ++中我们有函数指针和最近的lambdas,这可能就是为什么与Java相比,在C ++代码中使用未命名的类要少得多。此外,在c ++ 11之前,不允许将未命名的类作为模板参数,因此它们对于回调函数来说是一个糟糕的选择。
†在c ++中,匿名类(或结构)也可以是没有命名实例的类。它可以是另一个外部类的成员,并且匿名类的成员将被带到父类的命名空间。除此之外,标准不允许匿名类。那么这个东西怎么定义呢?好吧,匿名联盟是允许的,匿名类与它们类似。但是,C11标准允许使用匿名结构。
答案 1 :(得分:7)
您的Java示例是一个子类 - 它只是一个匿名子类。 @Override
关键字只是一个诊断辅助工具:如果方法不覆盖超类,它会发出错误。删除@Override
对生成的代码没有影响。 C ++ 11也有它 - 请参阅this link。
在Java中,与C ++一样,如果不声明子类,则无法覆盖虚函数。如果你想有效地使用Qt,你将不得不习惯它!