C++ C++;两级分层类中的多态性:不理解它为什么不起作用
我有一个类GenericNode,它由ValueNode和OperatorNode继承。 OR_节点继承运算符节点C++ C++;两级分层类中的多态性:不理解它为什么不起作用,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我有一个类GenericNode,它由ValueNode和OperatorNode继承。 OR_节点继承运算符节点 #include <iostream> #include <vector> template< typename T_Value > class GenericNode { public: GenericNode() {} ; virtual ~GenericNode() {} ; // virtual T_Value evaluate()
#include <iostream>
#include <vector>
template< typename T_Value >
class GenericNode
{
public:
GenericNode() {} ;
virtual ~GenericNode() {} ;
// virtual T_Value evaluate() { std::cout << "BAD I'm abstract, who call me?" << std::endl ;} ;
virtual T_Value evaluate() = 0 ;
} ;
template< typename T_Value >
class ValueNode : public GenericNode<T_Value>
{
public:
ValueNode() {} ;
ValueNode( T_Value arg0 )
{
this->aValue = arg0 ;
}
void setValue( T_Value arg0 )
{
this->aValue = arg0 ;
}
~ValueNode() {} ;
protected:
T_Value aValue ;
public:
virtual T_Value evaluate()
{
return this->aValue ;
}
} ;
template< typename T_Value >
class OperatorNode : public GenericNode<T_Value>
{
public:
OperatorNode() {} ;
OperatorNode( GenericNode<T_Value>* arg0 , GenericNode<T_Value>* arg1 )
{
std::cout << "aValue: " << arg0->evaluate() << std::endl ;
std::cout << "aValue: " << arg1->evaluate() << std::endl ;
this->left = arg0 ;
this->right = arg1 ;
std::cout << "aValue: " << this->left->evaluate() << std::endl ;
std::cout << "aValue: " << this->right->evaluate() << std::endl ;
}
virtual T_Value evaluate() { std::cout << "BAD I'm abstract OperatorNode, who call me?" << std::endl ;} ;
virtual ~OperatorNode() {} ;
//protected:
GenericNode<T_Value>* left ;
GenericNode<T_Value>* right ;
} ;
template< typename T_Value >
class OR_Node : public OperatorNode<T_Value>
{
public:
~OR_Node() {} ;
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
OperatorNode<T_Value>( arg0 , arg1 ) ;
}
public:
virtual T_Value evaluate()
{
std::cout << "ok here " << std::endl ;
std::cout << "-> " << this->left->evaluate() << std::endl ;
//return this->left->evaluate() + this->right->evaluate() ;
}
} ;
int main()
{
std::vector< GenericNode< int >* > myVec ;
ValueNode<int> One , Two , Three , Four , Five ;
One.setValue( 1 ) ;
Two.setValue( 2 ) ;
Three.setValue( 3 ) ;
Four.setValue( 4 ) ;
Five.setValue( 5 ) ;
OR_Node<int> orOne( &Three , &Four ) ;
//std::cout << "----> " << orOne.evaluate() << std::endl ;
myVec.push_back( &orOne ) ;
myVec.push_back( &One ) ;
myVec.push_back( &Two ) ;
myVec.push_back( &Three ) ;
myVec.push_back( &Four ) ;
myVec.push_back( &Five ) ;
// ValueNode< int > aVN( 1 ) ;
while (!myVec.empty())
{
std::cout << "-> " << myVec.back()->evaluate() << std::endl ;
myVec.pop_back();
}
return 0 ;
}
我不明白为什么代码行:
std::cout << "aValue: " << this->left->evaluate() << std::endl ;
std::cout evaluate()evaluate()我同意GHL的观点,您试图弹出一个空堆栈。尝试先检查堆栈是否为空,如果它确实为空,则会引发异常或退出。我同意GHL,您正在尝试弹出空堆栈。尝试先检查堆栈是否为空,以及是否出现空会引发异常或退出。如何生成一个?右或左是否指向从myVec弹出的值?弹出的对象将被删除,因此访问它们将segfault@AndyProwl是的,我怎样才能制作呢?该代码可以复制并粘贴到main.cpp和gcc main.cpp-o main.exec中。我可以放一些像pastebin这样的东西吗?@cppgay是的,但是如果你去掉行//std::cout,你可能想要从那些成员那里返回值。我从这个开始<代码>虚拟T_值评估(){std::cout如何生成一个?是右还是左指向从myVec弹出的值?弹出的对象将被删除,因此访问它们将segfault@AndyProwl是的,我如何生成它?可以将代码复制并粘贴到main.cpp和gcc main.cpp-o main.exec中。我可以放一些类似pastebin的东西吗?@cppgay是的,但是如果你取消行//std::cout您可能希望实际返回来自这些成员的值。我从这开始。virtual T_Value evaluate(){std::cout此外,如果这实际上是纯虚拟的,则OR_节点构造函数会触发编译错误:virtual T_Value evaluate()=0;
Ok,这解决了我的segfault。谢谢你的解释。谢谢大家;)另外,如果这是纯虚拟的,OR\u节点构造函数会触发编译错误:virtual T\u Value evaluate()=0;
Ok,这解决了我的segfault。谢谢大家的解释。谢谢大家;)
std::cout << "aValue: " << this->left->evaluate() << std::endl ;
std::cout << "-> " << this->left->evaluate() << std::endl ;
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
OperatorNode<T_Value>( arg0 , arg1 ) ;
}
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
: OperatorNode( arg0, arg1 )
{
}