多态性是否可以用于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();
}谢谢。
发布于 2014-11-15 15:54:49
static numBase count; 您已将count声明为numBase的对象。通过该对象,您可以尝试调用numBase的派生类的成员,即numDer.inc()。这个调用肯定不会成功,因为只有在使用指针/引用时,才适合运行时多态性。
发布于 2014-11-15 15:57:59
你不能用你想做的方式去做你想做的事情。
将numDer分配给numBase将对对象进行“切片”,而不再是正确的类型。
为了获得多态行为,您必须使用指针或引用。
编译器正确地报告了一个错误,告诉您numBase上不存在inc方法。
多态方法必须在基类中声明,也必须声明为virtual。
https://stackoverflow.com/questions/26943773
复制相似问题