假设我有一个班级Foo
class Foo{
public:
bool virtual bar(){return false;}
};
班级FooFoo
继承Foo
。类bar()
中未覆盖FooFoo
。我无法更改Foo
或FooFoo
的标头。那么是否可以覆盖bar()
中的FooFoo
的默认实现?
答案 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()
的指针替换为其他内容。当然,这将是一个丑陋的黑客,既不会在任何意义上推荐练习,也不会保证即使在某些内容发生变化时也能正常工作(例如编译标志)。