C++类的静态数据成员上的多态性

Polymorphism on a static data member of a C++ class

本文关键字:多态性 数据成员 静态 C++      更新时间:2023-10-16

多态性可以用于C++类的静态数据成员(又名"类变量")吗?

更新:正如 b4hand 所述,多态方法必须在基类中声明。但在这种情况下这是不可能的,因为事先不知道用户将在 containerDerived 中创建什么方法。

编辑了这个例子,包括参考文献;谢谢你提醒我。

以下是我将静态基类型(numBase)初始化为派生类型(numDer)的尝试:

#include <iostream>
class numBase                   //numBase is in a library user can not edit
{
};
class numDer : public numBase   //user defined class is a kind of numBase
{
    private:
        int num;
    public:
        void printNum() { std::cout << " numDer=" << num; }
        void inc() { num++; }
};
class containerBase             //containerBase is in a library user can not edit
{
    protected:
        //static numDer& count; //this compiles, but count can not be initialized to other types
        static numBase& count;  //this causes error six lines down from here
};
class containerDerived : public containerBase //user defined class is a kind of containerBase
{
    public:
        void inc() { count.inc(); } //error: 'count' was not declared in this scope
        void printCount() { std::cout << " containerDerived"; count.printNum(); }
};
/************************ user program **********************/
//initilialize static variable
numDer number;              //number could be any user defined type derived from numBase
numDer& containerBase::count = number; //initialize count to a kind of numBase
int main()
{
    containerDerived container1;
    containerDerived container2;
    container1.printCount();
    container1.inc();
    container2.inc();
    container1.printCount();
}

谢谢。

static numBase count;   

您已将 count 声明为 numBase 的对象。通过该对象,您尝试调用 numBase 派生类的成员,即 numDer.inc()。此调用肯定不会成功,因为运行时多态性仅在使用指针/引用时才适用。

你不能按照你试图做的方式做你想做的事情。

numDer分配给numBase将"切片"对象,并且不再是正确的类型。

为了获得多态行为,必须使用指针或引用。

编译器正确报告错误,告诉您numBase上不存在inc方法。

多态方法必须在基类中声明,并且还要声明virtual