我想知道的是:如果有一个基类,那么每个其他类都继承自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;
};
我根本不确定这一点,它正在努力。:(
答案 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)
很难给出一个适合所有答案的答案。
想一想它给你带来的好处。
现在想想它会带来多少额外的工作,例如:多重遗传并发症等。
一般来说这样做会比不这样做更多,所以你需要确保它能给你带来实质性的好处,否则你就是在浪费时间。