基类"Object",懒惰/聪明还是愚蠢?
Base class "Object", lazy/smart or stupid?
我想知道的是:在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对象。
很难给出一个一刀切的答案。
仔细想想它会给你带来什么好处
现在想想它将导致多少额外的工作,例如多重遗传并发症等。
一般来说,做这件事要比不做更多的工作,所以你需要确保这会给你带来实质性的好处,否则你就是在浪费时间。
- C++中是否存在 std::conditional 的懒惰等价物?
- 提升精神 x3 - 懒惰解析器
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 懒惰的参数评估try_emplace?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 并行循环中的懒惰矢量访问
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 放置/分段语法是否可能出现懒惰"operator or"重载?
- C++ Equivalent of Java Map<String, Object>
- 基类"Object",懒惰/聪明还是愚蠢?