如果我有这门课程:
class FooBar {
public:
FooBar(int qux);
void bar();
void foo1();
void foo2();
//...
void foo99();
}
如何覆盖bar
中的FooBar
方法,同时仍然可以使用所有其他foo
方法而无需再次定义它们?
修改
我想这样用:
FooBar2 baz(1); // call the constructor of FooBar, FooBar(1)
baz.foo1(); //call method foo1 of original FooBar
baz.bar(); // call method bar of FooBar2
我更喜欢不来编辑FooBar的标头或实现。
是否也可以使构造函数从FooBar
调用原始构造函数?
答案 0 :(得分:2)
您制作bar
virtual
,因为覆盖仅适用于virtual
方法。
然后,您展开FooBar
并为bar
提供新的实施。
class FooBar {
public:
virtual void bar();
void foo1();
void foo2();
//...
void foo99();
};
class FooBarDerived : FooBar
{
public:
void bar();
};
答案 1 :(得分:2)
继承。
class FooBar
{
public:
virtual void bar() { ... default implementation ... }
void foo1();
void foo99();
}
class FooBarVariation : public FooBar
{
public:
virtual void bar() { ... different implementation ... }
}
FooBarVariation
的行为与FooBar
类似,但bar()
的实现方式不同。
答案 2 :(得分:1)
您需要的是 功能隐藏 而不是 重叠 。
仅当涉及virtual
关键字时,才会应用覆盖。
只需重新定义要在派生类中重载的方法,就可以了。
class YourClass: public FooBar
{
public:
void bar(){}
};
类YourClass
对象可以访问FooBar
的所有方法,因为这些方法是public
方法,而您的类从中公开派生,而YourClass::bar()
隐藏 FooBar::bar()
。
修改强>
您编辑的问题清楚地表明 功能隐藏 确实是您所需要的。
这是一个 online demo 功能隐藏,可以满足您的要求。
是否也可以使构造函数从
FooBar
调用原始构造函数?
您可以使用 成员初始化列表 通过派生类构造函数调用相应的Base类构造函数。
好读:
What is this weird colon-member (" : ") syntax in the constructor?