从派生类访问静态const变量

时间:2015-06-11 10:03:24

标签: c++ static static-members

我想在每个派生类中设置 name 属性。并且还希望像 Bar1 :: s_name 那样获取此值。我的下面的代码不起作用。那么我应该如何归档我的愿望呢?

{
    "0" : {
        "minimumPayment" : [ 
            98.76
        ],
        "manufacturer" : "Manufacturer A",
        "range" : "Range A",
        "minimumRental" : [ 
            123.45
        ]
    },
    "1" : {
        "minimumPayment" : [ 
            197.53
        ],
        "manufacturer" : "Manufacturer A",
        "range" : "Range B",
        "minimumRental" : []
    }
}

3 个答案:

答案 0 :(得分:3)

据推测,您希望在某些多态环境中使用它。如果是这样,您就不能使用静态方法,因为它们不会表现出多态行为。此外,静态成员对于每个实例都是相同的,包括派生对象。

你可能想要这样的东西:

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

答案 1 :(得分:1)

我觉得你不明白static(在这种情况下)是什么意思 在类中定义为static的变量意味着只有一个实例。因此,s_nameBar1中的Bar2都会对一个变量进行处理 在类中定义为static的方法意味着它不绑定到该类的特定实例,而是绑定到该类的所有(可能没有)实例。因此,最好使用static而不是B::getName()来调用b.getName()方法(这不会让人感到困惑)。

另外,因为你将s_name定义为const static,所以你将它作为一个常量,哪个编译器在运行时甚至像变量那样对待,而是像常量一样。

答案 2 :(得分:-1)

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

string Parent::s_name = "\0";