基类"Object",懒惰/聪明还是愚蠢?

Base class "Object", lazy/smart or stupid?

本文关键字:Object 懒惰 基类      更新时间:2023-10-16

我想知道的是:在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;
};

我一点也不确定,这让我头疼。:(

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

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

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

最后,C#和Java的Object有一些有用的方法,因为它们在运行时有更多关于类型的信息。这使得所有类型都有一个根是合理的。一些C++框架也有它(脑海中浮现出MFC的CObject),但在C++中,在该级别提供有用的设施并非易事。您必须做的不仅仅是提供纯虚拟方法——拥有单个根的主要好处是通过继承而不是多态性来获得共享实现。以多态的方式使用Object只会破坏静态类型,在您的情况下,您甚至不会得到任何代码重用。

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

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

很难给出一个一刀切的答案。

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

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