C ++ - 生成子类实例的超类构造函数

时间:2010-07-16 11:22:27

标签: c++ inheritance constructor

我有两个类,其中一个是另一个的子类,并且只是因为它包含一个额外的成员变量到它的父类。我没有使用默认构造函数,将对单个对象的引用作为constructors参数传递。我想要的是父项的构造函数检查此对象,然后确定是构造父类的实例(在大多数情况下)还是子类(在少数特殊情况下)。

class Superclass 
{ 
    public: 
        Foo foo;

        Superclass(MyObject* object) 
        { 
            foo = object->GetFoo();

            if(object->CreateSubclass())
            {
                //Create Subclass
            }
            else
            {
                //Create Superclass
            }
        } 
}; 

class Subclass : public Superclass 
{ 
    public: 
        Barr barr;

        Subclass(MyObject* object)
        { 
            barr = object->GetBarr();
        } 
};

我知道工厂设计模式,但不想只为此拥有工厂对象。我宁愿将Superclass初始化内容复制到Subclass(看起来很糟糕),然后检查创建Superclass的每个点的对象,然后调用相应的构造函数:

Superclass* class;
if(object->CreateSubclass())
{
    class = new Subclass(obj);
}
else
{
    class = new Superclass(obj);
}

这种事情是否可行,如果是这样,我将如何从Superclass构造函数中调用子类构造函数?我试过调用Subclass(object),但是我遇到了需要在另一个之前定义Superclass和Subclass的问题。

感谢您提供任何建议。

2 个答案:

答案 0 :(得分:6)

如果您是针对工厂类设置的,为什么不只是一个静态函数?

class Subclass
{
public:
    static Superclass* create(const MyObject* const object)
    {
        if (object->createSubclass())
        {
            return new Subclass(object);
        }
        else
        {
            return new Baseclass(object);
        }
    }

    // ...
}

// ...

Superclass* const myInstance = Subclass::create(myObject);

(我把静态类放在Subclass中,因为它需要超级实现和子类实现,但是你可以很容易地将它放在共享命名空间中,或者甚至把声明放在基类中但是把实现放在一个cpp)

您现在已经获得了工厂类的大部分好处,没有比以前更多的代码。你只是缺少传递它的能力或者很容易将它重构为多个实现。

答案 1 :(得分:3)

我认为这是不可能的。在调用构造函数之前分配对象。否则就没有'this'指针,你无法初始化你的变量。想一想。还要注意构造函数不返回任何内容,但新的YourClass()的输出是指向新对象的指针。