繁体   English   中英

重载已实现的虚拟功能

[英]Overloading implemented virtual function

假设我有一类Foo

class Foo{
  public:
     bool virtual bar(){return false;}
};

并且类FooFoo继承了Foo FooFoo类中没有重写bar() 我不能更改FooFooFoo的标题。 那么,是否有可能覆盖FooFoobar()的默认实现?

这是不可能的; 您不能像以前那样修改类。

最好的选择可能是从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM