重载实现的虚函数

时间:2015-03-24 15:31:34

标签: c++

假设我有一个班级Foo

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

班级FooFoo继承Foo。类bar()中未覆盖FooFoo。我无法更改FooFooFoo的标头。那么是否可以覆盖bar()中的FooFoo的默认实现?

5 个答案:

答案 0 :(得分:3)

这是不可能的;你不能修改它而不修改它。

您最好的选择可能是公开继承FooFoo并在派生类中重写。

答案 1 :(得分:2)

  

是否可以覆盖默认实现   bar()在FooFoo?

不,但你可以派生另一个类,并通过基础“多态”使用该类。这应该具有相同的效果,因为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的签名在base中发生更改(这将导致派生不再是虚拟的话),则会出现编译器错误 - 这是人们想要的意识到了。

此致

答案 2 :(得分:1)

没有。您只能通过在派生类的定义中声明覆盖来覆盖函数。

答案 3 :(得分:1)

没有。您需要在FooFoo类定义中声明覆盖,您声明不能这样做。如果您尝试在类{}之外的FooFoo中定义覆盖函数,则会遇到错误,因为先前未在FooFoo中声明覆盖它。

另请注意,在C ++ 11及更高版本中,您应该使用override属性。例如:

struct FooFoo : Foo
{
    bool bar() override { return true; }
};

答案 4 :(得分:1)

用C ++语言编号。在特定实现中,技术上可以手动修改类FooFoo的vtable并将指向Foo::bar()的指针替换为其他内容。当然,这将是一个丑陋的黑客,既不会在任何意义上推荐练习,也不会保证即使在某些内容发生变化时也能正常工作(例如编译标志)。