Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象标识符、返回值或变量?_C++_Inheritance - Fatal编程技术网

C++ 对象标识符、返回值或变量?

C++ 对象标识符、返回值或变量?,c++,inheritance,C++,Inheritance,目前正在构建这个对象层次结构,为了能够在基类中更清楚地记录日志,我决定使用某种类型的变量或函数来返回类的类型 例如: class fruit { string _type; fruit() { _type = "base"; // or i dont have to set it. however, it wont be inforced } virtual const char* type() const { return "base"; } // o

目前正在构建这个对象层次结构,为了能够在基类中更清楚地记录日志,我决定使用某种类型的变量或函数来返回类的类型

例如:

class fruit {
   string _type;

   fruit() {
       _type = "base"; // or i dont have to set it. however, it wont be inforced
   }

   virtual const char* type() const { return "base"; } // or just = 0 to inforce it

   void function() {
       log(this->type(), " tastes good");
       log(this->_type, "tastes good");
   }
}

class apple : public fruit {

   apple() {
       _type = "apple";
   }

   const char* type() const { return "apple"; }
}
正如您所看到的,有两种方法,我个人认为返回值版本更干净,因为它显然需要实现


然而,我的问题是什么方法是最好的?每次我记录一些东西时调用函数会慢很多吗?只是假设它会被优化,但我可能错了

首先,如果您需要知道程序中的类的类型,那么您的设计中就存在一些错误。通常,您不希望您的程序依赖于具体的接口,而是依赖于接口

无论如何,该函数应该是一个纯虚拟函数,因此每个派生类都必须实现它,否则,如果有人没有为其派生类实现它,您将最终得到错误的派生类类型

分配字符串和返回字符串文字都很好。
字符串文字具有静态存储持续时间,因此它在整个程序持续时间内都有效,您还可以适当地使用
const char
返回类型,以便用户不会修改返回的文字,并最终导致未定义的行为

返回一个成员也可以,不过这只会给你的类增加额外成员的开销&你不必太担心这个额外成员。

我使用它的唯一目的是记录日志,以明确我处理的是哪个dervied类。我需要一个字符来描述这个类。千叶:在这种情况下,我觉得没什么问题。请注意让函数纯虚拟的要点。不太确定“你不想让你的程序依赖于具体的imlpements,而是依赖于接口”来解释什么。千叶:这是设计原则之一,你可能想查找是的,我知道这一点,我不依赖代码中的实现。我更多的是问这和我的问题有什么关系。