[英]Overloading implemented virtual function
假设我有一类Foo
class Foo{
public:
bool virtual bar(){return false;}
};
并且类FooFoo
继承了Foo
。 在FooFoo
类中没有重写bar()
。 我不能更改Foo
或FooFoo
的标题。 那么,是否有可能覆盖FooFoo
中bar()
的默认实现?
这是不可能的; 您不能像以前那样修改类。
最好的选择可能是从FooFoo
公开继承并在派生类中重写。
那么是否有可能覆盖FooFoo中bar()的默认实现?
不,但是您可以派生另一个类,并通过基础“多态”使用该类。 假设Foo的原始客户通过Foo的界面完成工作,这应该具有相同的效果,
因此:
//In Foo.h - may not be modified
struct Foo
{
virtual bool bar(){ return true;}
};
//In FooFoo.h - may not be modified, hence no override...
struct FooFoo: public Foo
{
virtual bool bar(){/**/}
};
//FooFoo_2 - The new class - may be implemented in terms of FooFoo
struct FooFoo_2: public Foo
{
virtual bool bar() override{/*new implementation*/}
};
void fooUser( Foo& foo )
{
bool result = foo.bar();
if (result ){} //etc
}
int main()
{
FooFoo_2 theNewImplementation;
fooUser( theNewImplementation );
return 0;
}
还要注意,“ override”不是必需的,但是如果添加了bar,则如果bar的签名的基数发生变化(会导致派生不再是虚拟的),则会导致编译器错误-这是您要意识到的。
问候
不能。您只能通过在派生类的定义中声明替代来覆盖函数。
不能。您需要在FooFoo
类定义中声明覆盖,您不能这样做。 如果您试图在类之外的FooFoo
定义重写函数, FooFoo
遇到错误,因为以前没有在FooFoo
声明它被重写。
还要注意,在C ++ 11和更高版本中,应使用override
属性。 例:
struct FooFoo : Foo
{
bool bar() override { return true; }
};
在C ++语言中 在特定的实现中,从技术上来说,可以手动修改类FooFoo
vtable并将指向Foo::bar()
指针替换为其他内容。 当然,这将是一个丑陋的技巧,无论从什么意义上都没有建议的实践,也不能保证即使有什么变化(例如编译标志)也能正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.