如何初始化派生类中的静态成员?

Posted

技术标签:

【中文标题】如何初始化派生类中的静态成员?【英文标题】:How to initialize static members in derived classes? 【发布时间】:2011-04-04 15:33:29 【问题描述】:

好吧,显然,我不能。但这是我的问题。也许这是一个设计问题,我搞错了。

我希望在每个派生类中以不同方式初始化一个类成员。想象一下我有一个Device 类型的对象。这个Device只是应用程序代码使用的一个接口,因为实际的设备只是DeviceADeviceB这两种类型之一。所有设备都有一些共同的功能,例如名称。那应该是班级成员,不是吗?所以我有:

class Device 
    static std::string sm_name;

但每个家庭设备都有自己的名称。 如何将每个派生类的名称初始化为不同的值? 设计是否错误? name 属性不应该是类成员吗?

【问题讨论】:

Are static variables in a base class shared by all derived classes? 的可能重复项 哎哟!我应该更仔细地阅读答案O:) 【参考方案1】:

name 属性不应该是类成员吗?

每个家庭设备都应该有自己的私有静态成员。您可以使用虚拟方法在设备实例上返回正确的名称。

【讨论】:

好吧,我明白了,除了让每个派生类定义自己的成员之外别无选择。【参考方案2】:

为什么不只是有一个返回名称的虚成员函数,并在派生类中实现它以返回正确的名称?

例如

class A

public:
   virtual std::string name() = 0;
;

class B : public A

public:
virtual std::string name()  return "typeB"; 
;

class C : public A

public:
virtual std::string name()  return "typeC"; 
;

【讨论】:

不过,您会希望函数是虚拟的。为了安全起见,As 析构函数应该是虚拟的或受保护的。 对不起,我匆忙错过了虚拟:-(

以上是关于如何初始化派生类中的静态成员?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能访问静态多态派生类中的受保护成员?

关于纯抽象类中的静态成员函数 - 设计模式?

关于类中静态成员函数和静态成员变量的知识点

C++类中的静态成员函数以及静态成员变量

C++类中的静态成员函数以及静态成员变量

使用类中的参数初始化静态对象成员