从派生类访问静态常量变量
Access static const variable from derived classes
我想在每个派生类中设置名称属性。并且还想像 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
变量意味着它只有一个实例。因此,Bar1
和Bar2
都s_name
到一个变量。
在类中定义为static
的方法意味着,它不绑定到该类的特定实例,而是绑定到该类的所有(可能没有)实例。因此,最好使用 B::getName()
而不是 b.getName()
调用static
方法(它不那么令人困惑)。
此外,因为您将s_name
定义为const static
所以您将其设置为常量,编译器甚至将其视为运行时中的变量,但更像常量。
您应该
定义所有静态变量。 代码中缺少定义。将以下行添加到您的程序中,它将起作用。
string Parent::s_name = " ";
相关文章:
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 非常量变量只读位置的赋值
- 使用大量已知常量变量的正确方法
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 这些语句是否等效(静态变量、常量变量和泛型)
- 包含常量变量并包含在多个文件中的标头的链接错误
- 我们如何修改常量变量的值
- 如何在模板类中设置静态常量变量
- 为什么常量变量是模板特殊化所必需的,而不是常量
- 如何在函数中传递常量变量?
- 定义常量变量的最佳方法
- C++ 声明常量变量,但推迟其初始化?
- 如何初始化具有常量变量的结构数组
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 使用指针 c++ 更改常量变量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 lambda 对象中的局部变量是常量变量?
- 使用常量变量作为数组的大小
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?