重新定义派生类的继承内部函数以对基类产生影响

时间:2013-02-09 09:25:14

标签: c++ inheritance

请查看此代码。它只反映了我想要做的基本概念:

#include <iostream>
using namespace std;

class Base
{
public:
    Base() 
    {
        /* Some code I want to reuse */
        Redefined(); 
    }
    virtual ~Base() {}
    void Redefined() { val = 10; }
    int val;
};

class Derived : public Base
{
public:
    Derived() : Base() {}
    ~Derived() {}
    void Redefined() { val = 25; }
};

int main()
{
    Base* check = new Derived();

    cout << check->val << endl;

    system("pause");
    return 0;
}

我希望val对象的check属性为25而不是10。

如你所见,我有两节课。 Base类构造函数有一些复杂的功能,我希望Derived类在它的构造函数中也有。如何更改派生函数Redefined,以便我不必完全重写Derived构造函数(实际上只是复制粘贴整个基类构造函数代码并替换一行代码 - 更新版本Redefined函数)?

2 个答案:

答案 0 :(得分:2)

你无法真正覆盖这种功能。通常情况下,您可以使用虚函数,但这在构造函数中不会按照您想要的方式工作。

更好的方法是将您想要的值传递给Base构造函数:

class Base
{
public:
    Base(int init_val = 10) 
    {
        /* Some code I want to reuse */

        val = init_val;
    }
    virtual ~Base() {}

    int val;
};

class Derived : public Base
{
public:
    Derived() : Base(25) {}
    ~Derived() {}

};

这样任何派生类都可以将其选择的值传递给基类。

答案 1 :(得分:0)

根据上述评论:

我实际上认为正确的解决方案是拥有一个“接口”类型的基类(即具有纯虚函数的基类,并且派生类实际上实现了正确的行为),然后让每个类处理构造它自己的DirectX缓冲区。您可能会发现,您需要2-3个不同的派生类,它们以不同的方式构造缓冲区,然后从实际执行实际工作的类派生。我希望这是有道理的。

或者,您将足够的参数传递给基类,以便可以构造缓冲区。但我认为第一个建议是更好的选择。