考虑下面的代码:
class Bas
{
public:
virtual void test() = 0;
};
class Sub : public Bas
{
public:
void test(){};
void subfunc(){};
};
int main()
{
Bas * bs = new Sub();
bs->test();
bs->subfunc(); //Gives error
return 0;
}为什么不能在这里使用多态性?我的意思是,对象bs是Bas和Sub类型的,为什么只能使用Bas中的函数?
发布于 2016-09-05 01:46:24
你只能获得那些你在基类中使用基类指针定义的函数。你的基类没有subfunc(),这就是你出错的原因。下面的代码可能对你有用
class Bas
{
public:
virtual void test() = 0;
virtual void subfunc(){};
};
class Sub : public Bas
{
public:
void test(){};
void subfunc(){};
};
int main()
{
Bas * bs = new Sub();
bs->test();
bs->subfunc();
return 0;
}发布于 2016-09-05 01:47:06
多态不适用于subfunc,因为它不是基类中的虚方法。
Polymorphism (subtyping in this case)仅适用于在基类中被重写的虚方法。编译器向具有该虚方法的每个类添加一个vtable,以便在运行时调用正确的方法(请参见virtual method table)。
向Bas类添加一个没有实现的虚拟子函数。
class Bas
{
public:
virtual void test() = 0;
virtual void subfunc() = 0; //add this
};发布于 2016-09-05 01:51:58
在main函数中,已知bs的类型为Bas。
如果您希望编译器利用它也具有类型Sub (例如调用subfunc),您可以在确保bs确实具有类型Sub的方法的条件下将bs向上强制转换为类型Sub。
class Bas
{
public:
virtual void test() = 0;
virtual bool isSub() const { return false; }
};
class Sub : public Bas
{
public:
void test(){};
virtual bool isSub() const { return true; }
void subfunc(){};
};
int main()
{
Bas * bs = new Sub();
bs->test();
if (bs->isSub()) {
assert(dynamic_cast<const Sub*>(bs));
static_cast<Sub*>(bs)->subfunc();
}
return 0;
}https://stackoverflow.com/questions/39319758
复制相似问题