0

我想知道的是:如果有一个基类,那么在 C++ 中,每个 * 其他类都继承自一个好主意。基本上,它和 C# 的 Object 具有相同的接口,即:

*除了直接接口和数据结构

class Object
{
public:
    virtual ~Object() {}
    virtual std::string toString() const = 0;
    virtual Object* copy() const = 0;
    virtual void release() = 0;
private:
    // This operator overload calls toString() to print it out to the stream.
    friend std::ostream& operator<<(std::ostream& output, const Object& object);
};

这是一件好事吗,或者如果我希望将类复制或转换为字符串,我最好只制作单独的接口。

例如

class Copyable
{
public:
    virtual ~Copyable() {}
    virtual Copyable* copy() const = 0;
};

我完全不确定这一点,而且它让我很头疼。:(

4

4 回答 4

4

我不会这样做的。您Object强制每个类都实现那些纯虚拟方法。如果你真的不需要它们怎么办?

C++ 具有多重继承,因此您可以为每个目的使用一个单独的类,并让派生类决定它们需要哪些特征。

拥有这些虚函数也会增加开销,因为它为每个类的每个实例添加了一个 vptr。可能不会产生可怕的影响,但它不是 C++ 精神 IMO。

最后,C# 和 JavaObject有一些有用的方法,因为它们在运行时有更多关于类型的信息。这使得所有类型都有一个单一的根是合理的。一些 C++ 框架也有它(CObject我想到了 MFC),但是在那个级别提供有用的工具在 C++ 中并不是微不足道的。您必须做的不仅仅是提供纯虚拟方法 - 拥有单个根的主要好处是通过继承而不是多态性获得共享实现。以多态方式使用你Object只会破坏静态类型,在你的情况下,你甚至没有得到任何代码重用。

于 2012-07-06T08:40:54.597 回答
0

C++ 没有针对所有对象的通用基类,主要是因为性能原因,尤其是因为 VMT(虚拟方法表)。VMT 是一个指针,存在于具有至少一个虚拟方法的每个对象中。C++ 的作者希望支持简单的对象(例如,主体由一个 int 组成)。这是有效和合理的目标。

于 2012-07-06T08:35:55.583 回答
0

很难给出一个万能的答案。

想想它会给你带来什么好处。
现在想想它会导致多少额外的工作,例如多重继承并发症等。

一般来说,这样做会比不做更多的工作,所以你需要确保它会给你带来实质性的好处,否则你就是在浪费时间。

于 2012-07-06T10:40:57.840 回答
0

这仅在语言级别(如在 Java 中)强制执行时才有效。在 C++ 中,无论如何您都必须处理非对象对象。没有办法强制库从Object. 一旦你从 中实例化任何东西std::,你的代码中就会有一个非 Object 对象。

于 2012-07-06T08:51:28.443 回答