1

我有一个奇怪的 C++ 问题,我不确定它是否以这种方式正常工作,或者如果我错过了什么。

有一个类A继承自ABase. ABase并且A两者都有一个方法Generate()while A::Generate()should overwrite ABase::Generate()

Generate() 从 ABase 的构造函数中调用。

现在我的问题:

我做了一个new A()首先跳转到 A 的构造函数并从那里跳转到 ABase 的构造函数的操作。ABase::ABase()现在调用Generate(). 我想要做的:A::Generate()应该被执行(因为这会覆盖ABase::Generate())。

不幸的是,它似乎ABaseABase::Generate()调用了构造函数并且从不调用A::Generate()

我猜这是因为 A 在这个阶段没有完全构建?或者有没有办法让ABase::ABase()使用A::Generate()

4

3 回答 3

5

不想被执行,因为这将A::Generate()涉及在尚未构造的类上执行函数。C++ 被有意设计成在构造过程中,对象的动态类型就是正在构造的类型,正是为了避免此类问题。

于 2013-07-04T13:36:22.140 回答
0

解决起来并不容易,而且绝对不漂亮,但你可以做这样的事情:

class ABase
{
public:
    ABase()
    {
        // Normal constructor, calls `Generate`
    }

    virtual void Generate() { ... }

    // ...

protected:
    struct do_not_call_generate_tag {};

    const static do_not_call_generate_tag do_not_call_generate;

    ABase(const do_not_call_generate_tag)
    {
        // Same as the normal `ABase` constructor, but does _not_ call `Generate`
    }
};

class A : public ABase
{
public:
    A()
        : ABase(ABase::do_not_call_generate)
    {
        // Other initialization
        PrivateGenerate();
    }

    void Generate()
    {
        PrivateGenerate();
    }

private:
    void PrivateGenerate()
    {
        // Do what your old `Generate` does
    }
};
于 2013-07-04T13:42:10.213 回答
0

为了有很好地构造初始化对象,我会将这两个任务彼此分开:

class ABase
{
public:
    virtual void Generate()
    {
        //...
    }
};

class A: public ABase
{
public:
    virtual void Generate()
    {
        //...
    }
};

现在您必须明确地执行这两项任务

A *someA = new A();
someA->Generate();

...但是您可以将其分组在内部,例如Create()方法或重新定义new运算符等。

于 2013-07-04T15:10:04.070 回答