是否有一个基类,C ++标准库的所有成员都可以从中派生出来?

时间:2015-10-19 21:00:17

标签: c++ oop c++11 polymorphism base-class

C ++ / CLI有一个System :: Object类来实现此目的,但我似乎无法在标准库中找到它。基本上我是在编写一组类,我希望基类在std::string属性中存储content的向量,但是派生类可能需要存储其他东西的向量(甚至可能是我自己的一个班级)。这似乎是一个奇怪的目标,但我正在写一些文件访问类,让我更容易操作不同格式的文件。基类File类将每个行存储在字符串中,作为向量的一部分 - 但是,例如,JSON的类可能需要存储JS样式的集合/对象等。

我能想到的唯一方法就是让content属性成为一个对象的向量(或者其他一些通用的基类 - 我也可以从它派生出任何自定义类来实现多态性的过程然后根据正在使用的子对象的类型将其转换回任何类型。我很快发现,我无法在任何地方找到std::object(或类似的)。

这个例子应该展示我尝试做的事情:

class File {
protected:
    std::vector<std::object> _content;

public:
    //Contructors/methods/etc.

    std::string getItemAt(size_t index) {
        return static_cast<std::string>(this->_content[index]);
    }

    void setItemAt(size_t index, std::string value) {
        this->_content[index] = static_cast<std::object>(value);
    }
};

class JSONFile: File {
public:
    //Constructors/methods/etc.

    SomeObject getItemAt(size_t index) {
        return static_cast<SomeObject>(this->_content[index]);
    }

    void setItemAt(size_t index, SomeObject value) {
        this->_content[index] = static_cast<std::object>(value);
    }
};

请注意,此示例假定std::object存在,并且SomeObject将是用于处理JSON(例如,再次,这可能是任何内容)数据的任何内容。 SomeObject显然来自std::object

任何建议都会非常感激,如果我对此有完全错误的方式,那么我是如何做到这一点的任何反馈,以便std::object我们将不胜感激。)

3 个答案:

答案 0 :(得分:8)

没有

因为C ++完全是“你只需支付你使用的费用”。

std::object的界面会是什么样的?如果有任何成员函数,则必须virtual才能使用,因为动态调度会导致运行时成本。

如果假设的std::object是一个空类,那么你可以用std::object引用做什么?不多,因为它没有任何成员函数可以调用。为什么在没有任何共同点的时候,所有东西都来自一个单一的基础。

如果 确实 需要所有课程的基础,您可以随时编写一个。但请注意,这样做might nota good design decision

答案 1 :(得分:4)

  

是否有一个基类,C ++标准库的所有成员都可以从中派生出来?

简短的回答是&#34; No。&#34;
答案很长,#34;肯定不是。&#34;

可以在相关的SO网站上看到提供更多详细信息的答案:Why is base-for-all-objects discouraged in C++

答案 2 :(得分:2)

当我看到你定义

std::vector<std::object> _content;

它告诉我,你的目标是使用模板进行泛型编程而不是使用继承进行面向对象编程。这与std :: vector和co。的风格相同,所以它不应该看起来太陌生。

您的代码可能是:

template <typename FileObject>
class File {
public:
    std::vector<FileObject> _content;

public:
    //Constructors/methods/etc.

    FileObject getItemAt(size_t index) {
        return this->_content[index];
    }

    void setItemAt(size_t index, std::string value) {
        this->_content[index] = FileObject(value);
    }
};

然后将其用作

json_files = File<JSONObject>();
json_files.setItemAt(1, "{}");

或者如果要对json对象列表执行特殊操作,则该函数可以采用显式File<JSONObject>参数。它也可以从File<JSONObject>继承,但不鼓励混合和匹配OO / Generic。

现在,更接近您的标题问题:您无法在同一向量中轻松存储不同的文件类型,但请考虑如何实现它。 File<int>的存储要求是什么?对于File<double>?这是你的OO /继承解决方案变得笨拙的核心位置,并且使用通用编程使得尝试变得不可能,这很好。