在c ++类中覆盖一个方法

时间:2012-08-24 10:11:47

标签: c++

如果我有这门课程:

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调用原始构造函数?

3 个答案:

答案 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?