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

标签 c++ inheritance

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

*直接接口(interface)和数据结构除外

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);
};

这是一件好事,还是如果我希望类被复制或转换为字符串,我最好只制作单独的接口(interface)。

例如

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

我对此完全不确定,这让我很头疼。:(

最佳答案

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

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

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

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

关于c++ - 基类 "Object",懒惰/聪明还是愚蠢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11358663/

相关文章:

c# - 使用泛型类型接口(interface)创建对象实例时出现编译错误

c++ - 关于在何处在线学习 C 以准备学习 Objective-C 的任何建议

c++ - 更改 Mavlink 消息速率 ArduPilotMega

c++ - 如何使用嵌套枚举实现代码重用

c++ - 如何根据参数的类型实例化不同的类?

c++ - 当 C++ 中没有多态时如何传递像多态这样的结构

c++ - istringstream、ostringstream 和 stringstream 有什么区别?/为什么不在每种情况下都使用 stringstream?

c++ - 如何使用一些完全用 C\C++ 编程语言编写的库将 pcm 音频转换为文本?

c++ - 空基类构建开销?

C++继承问题错误C2084函数已经有一个主体