从派生类访问静态常量变量

Access static const variable from derived classes

本文关键字:常量 变量 静态 访问 派生      更新时间:2023-10-16

我想在每个派生类中设置名称属性。并且还想像 Bar1::s_name 一样访问这个值。我下面的代码不起作用。那么我应该如何存档我的愿望呢?

 class Parent {
   public:
     static std::string getName() {
       return s_name;
     }
     const static std::string s_name;
 };

 class Bar1 : public Parent {
   public:
     Bar1() : s_name("Bar1") {}
 };
 class Bar2 : public Parent {
   public:
     Bar2() : s_name("Bar2") {}
 };

 int main() {
   Bar1 b;
   b.getName();
   return 0;
 }

大概你想在一些多态上下文中使用它。如果是这样,则不能使用静态方法,因为它们不表现出多态行为。此外,静态成员对于每个实例(包括派生对象)都是相同的。

你可能想要这样的东西:

class Parent {
   public:
     virtual std::string getName() {
       return "Parent";
     }
 };

 class Bar1 : public Parent {
   public:
     virtual std::string getName() override {
       return "Bar1";
     }
 };
 class Bar2 : public Parent {
   public:
     virtual std::string getName() override {
       return "Bar2";
     }
 };

如果您还希望能够像 Bar1::s_name 一样静态访问名称,则需要每个类的静态成员:

class Parent {
   public:
     virtual std::string getName() {
       return s_name;
     }
     const static std::string s_name;
 };
 const std::string Parent::s_name = "Parent";
 //likewise for the others

我认为您没有正确理解static(在这种情况下)的含义。
在类中定义为static变量意味着它只有一个实例。因此,Bar1Bar2s_name到一个变量。
在类中定义为static的方法意味着,它不绑定到该类的特定实例,而是绑定到该类的所有(可能没有)实例。因此,最好使用 B::getName() 而不是 b.getName() 调用static方法(它不那么令人困惑)。

此外,因为您将s_name定义为const static所以您将其设置为常量,编译器甚至将其视为运行时中的变量,但更像常量。

您应该

定义所有静态变量。 代码中缺少定义。将以下行添加到您的程序中,它将起作用。

string Parent::s_name = "";