基类“对象”,懒惰/聪明还是愚蠢?

时间:2012-07-06 08:33:42

标签: c++ inheritance

我想知道的是:如果有一个基类,那么每个其他类都继承自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 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

很难给出一个适合所有答案的答案。

想一想它给你带来的好处。
现在想想它会带来多少额外的工作,例如:多重遗传并发症等。

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