2

请看这段代码。它只是反映了我想做的基本概念:

#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函数的更新版本)?

4

2 回答 2

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() {}

};

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

于 2013-02-09T09:42:49.810 回答
0

基于以上评论:

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

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

于 2013-02-09T13:48:54.373 回答