繁体   English   中英

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

[英]Polymorphism on a static data member of a C++ class

可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM