c++ - 返回指向子类的指针的好方法

标签 c++

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

3年前关闭。




Improve this question




这是我必须应对的设计挑战。
Base 的子类具有它自己的特定功能,这些功能未在 Base 中定义。
我需要设计一种方法,以便可以根据输入日期生成不同的子类实例。

输入数据Data作为函数 FactoryMethod 的传入参数包含一些复杂的逻辑来确定要生成哪个子类。预先存在的设计(即下面列出的 FactoryMethod)的问题是客户端必须向下转换指向 base 的返回指针,以便调用仅在子类中定义的函数。这个方法在当前的设计中是有问题的 b/c,我们不知道在 FactoryMethod 内部创建了什么子类。我只能想到两种可能的解决方案

解决方案1>在base中引入一个类型,用于存储指向base的指针的类型信息。是否有一个很好的例子向我展示了最佳实践?

解决方案2>在FactoryMethod的实现中返回指向子类而不是基类的指针。再说一次,有没有一个很好的例子来炫耀这一点?

class Base {
public:
    ...
    virtual void BaseFuncA() {}
};

class SubClassA : public Base {
public:
    ...
    void SubClass_A_Func2() {}
}

class SubClassB : public Base {
public:
    ...
    void SubClass_B_Func3() {}
}


Base* FactoryMethod(Data)
{
    if (Data designed for SubClassA)
        return new SubClassA

    if (Data designed for SubClassB)
        return new SubClassB
    ...    
}

问题:SubClassA的客户必须向下转换才能调用子类函数
SubClassA* ptr = dynamic_cast<SubClassA*> (pointer to Base*);

众所周知,如果您总是不得不处理代码中的向下转换,那么设计就有缺陷。

问题 > 有没有一本好书/资源可以让我找到解决这个问题的实用方法。换句话说,代码的客户端不必为了使用子类中定义的函数而向下转换指针。例如,工厂方法可能会返回子类指针,而不是采用 boost::variant?

BTW:把所有的功能都放到Base里面,在Base里面提供虚拟的实现是不现实的。即使您可以这样做,您也将无法在不向下转型的情况下获得子类提供的真正功能。

最佳答案

尝试阅读访问者模式以避免降级。希望能帮助到你。

http://en.wikipedia.org/wiki/Visitor_pattern

关于c++ - 返回指向子类的指针的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296076/

相关文章:

c++ - shared_ptr 的缺点

c++ - 如何创建 Eigen::Ref vector

c++ - 大型 C++ 项目的推荐 Eclipse CDT 配置是什么(索引器需要永远)

c++ vector 下标超出范围错误

c++ - 链接规范无效

c++ - qtCreator 错误 : can't map file, errno=22 架构 x86_64 文件?

c++ - "invalid conversion from ' 文件* {aka _iobuf} ' to ' int '"错误

c++ - 在带有整数的控制台中显示无关紧要的数字

c++ - 检查以确保 argv[1] 是整数 C++

c++ - 在 linux 下,如何通过 .html 运行应用程序