两级层次类中的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 ;
产生segfault。
谢谢!:D
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
OperatorNode<T_Value>( arg0 , arg1 ) ;
}
此代码:
- 调用基类
OperatorNode<T_Value>
的默认构造函数 - 构造另一个类型为
OperatorNode<T_Value>
的临时对象,将arg0
和arg1
传递给它 - 暂时放弃
因此,OR_Node<T_Value>
中的OperatorNode<T_Value>
的成员仍然是未初始化的指针。
初始化基类子对象的正确方法是使用成员初始化器列表:
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
: OperatorNode( arg0, arg1 )
{
}
我同意GHL的观点,你试图弹出一个空堆栈。尝试先检查堆栈,看看它是否为空,如果它确实为空,则抛出异常或退出。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 两级层次类中的C++多态性:不明白为什么它不起作用