我想在每个派生类中设置 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" : []
}
}
答案 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_name
和Bar1
中的Bar2
都会对一个变量进行处理
在类中定义为static
的方法意味着它不绑定到该类的特定实例,而是绑定到该类的所有(可能没有)实例。因此,最好使用static
而不是B::getName()
来调用b.getName()
方法(这不会让人感到困惑)。
另外,因为你将s_name
定义为const static
,所以你将它作为一个常量,哪个编译器在运行时甚至像变量那样对待,而是像常量一样。
答案 2 :(得分:-1)
你应该定义所有静态变量。您的代码中缺少定义。 将以下行添加到您的程序中,它将起作用。
string Parent::s_name = "\0";