2017-10-14 103 views
0

如果我有一个派生类的基类,是否有可能创建实例作为低音或派生类依赖传递给单个构造函数的参数?C++可以创建派生而不是低音类依赖于给单个构造函数的参数吗?

例如代码:

//Base Class 
class MyClass { 
public: 
    //All instances created with this constructor 
    MyClass(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     // TODO - create this object as SubClass instead 
    } else { 
     //normal base class construction 
    } 
    } 
} 

//Derived Class 
class SubClass { 
public: 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

MyClass object1(1, 2); //should create MyClass object 
MyClass object2(2, 1); //should create SubClass object 

如上所示,创建这个类的一个实例时,我想构造要么功能正常,使类,或(取决于给定为参数的值)使其成为派生子类的一个实例。请注意,它必须基于不同参数的值,而不仅仅是它们的类型。是否有可能做到这一点?如果有必要的话,只要有一个构造函数必须被使用,它就会有另一个派生类来表示'normal'选项(而不是使用纯低音类)。

如果这是不可能的,我可以只需调用子类构造函数时,我想这方面的一个例子,但是这并不理想,因为我会检查哪一个应该每一个被创建时被创建,而而不仅仅是在构造函数中进行一次内部检查。

+2

这是工厂设计模式是,你传递的参数为工厂创建,并返回要么MyClass的或基于参数的子类。 – mnistic

回答

1

您可以委托创作到MyClass静态函数:

class SubClass; 

//Base Class 
class MyClass { 
    MyClass(int param1, int param2) { 
    } 
public: 
    static unique_ptr<MyClass> Create(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     return std::make_unique<SubClass>(param,param2); 
    } else { 
     return std::make_unique<MyClass>(param,param2); 
    } 
    } 
} 

//Derived Class 
class SubClass : public MyClass { 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 
public: 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object 
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object 
+0

太棒了!有什么办法可以使构造默认为静态方法吗?假设没有,我可以抛出一个异常,每当构造函数被调用(除非通过静态方法),以强制使用静态方法? – ZSmith

相关问题