1

如果我有这门课:

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

4

3 回答 3

2

你 make bar virtual,因为覆盖只适用于virtual方法。

然后你扩展FooBar并提供一个新的实现bar

class FooBar {
    public:
        virtual void bar();

        void foo1();
        void foo2();
        //...
        void foo99();
};

class FooBarDerived : FooBar
{
    public:
        void bar();
};
于 2012-08-24T10:14:00.743 回答
2

遗产。

class FooBar
{
public:
    virtual void bar() { ... default implementation ... }
    void foo1();
    void foo99();
}


class FooBarVariation : public FooBar
{
public:
    virtual void bar() { ... different implementation ... }
}

FooBarVariation将像 a 一样FooBar,但具有不同的实现bar()

于 2012-08-24T10:16:03.957 回答
1

您需要的是Function Hiding而不是覆盖
仅当virtual涉及关键字时才适用覆盖。

只需在派生类中重新定义要重载的方法,就可以了。

class YourClass: public FooBar 
{
    public:
       void bar(){}
};

YourClass对象可以访问 的所有方法,FooBar因为这些是public方法,并且您的类从它公开派生,而YourClass::bar() 隐藏 FooBar::bar().

编辑:
您编辑的问题清楚地表明,功能隐藏确实是您所需要的。
这是实现您的要求的功能隐藏的在线演示。

是否也可以让构造函数调用原来的构造函数FooBar

您可以使用成员初始化列表通过派生类构造函数调用适当的基类构造函数。

好读:
构造函数中这个奇怪的冒号成员(“:”)语法是什么?

于 2012-08-24T10:14:02.397 回答