繁体   English   中英

C ++多态性在两级层次结构类中:不了解为什么它不起作用

[英]C++ Polymorphism in two level hierarchical class: do not understand why it does not work

我有一个类GenericNode,它由ValueNode和OperatorNode继承。 OR_Node继承OperatorNode。

#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 ;
}

输出为:

aValue: 3
aValue: 4
aValue: 3
aValue: 4
-> 5
-> 4
-> 3
-> 2
-> 1
ok here 
Segfault

我不明白为什么这行代码:

std::cout << "aValue: " << this->left->evaluate() << std::endl ;

工作正常,线

std::cout << "-> " << this->left->evaluate() << std::endl ;

产生段错误。

谢谢! :d

OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
    OperatorNode<T_Value>( arg0 , arg1 ) ;
}

这段代码:

  1. 调用基类OperatorNode<T_Value>的默认构造函数
  2. 构造另一个类型为OperatorNode<T_Value>临时对象,将arg0arg1传递给它。
  3. 丢弃该临时文件。

因此, OR_Node<T_Value>中的OperatorNode<T_Value>的成员仍然是未初始化的指针。

初始化基类子对象的正确方法是使用成员初始化程序列表:

OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
    : OperatorNode( arg0, arg1 )
{
}

我同意GHL,您正在尝试弹出一个空堆栈。 尝试检查堆栈以首先查看其是否为空,以及是否确实将其转为空,则引发异常或退出。

暂无
暂无

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

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