[英]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.