【C++学习】多态——解析树实例分析

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 场景:   分析: 每个类的节点都必须提供它自己的Calc方法,所以采用多态进行操作。我们将Node节点和BinNode节点设计为抽象类,抽象类是不能实例化的类,它们只能作为其他类的父类。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

场景:

clip_image002

 

分析: 每个类的节点都必须提供它自己的Calc方法,所以采用多态进行操作。我们将Node节点和BinNode节点设计为抽象类,抽象类是不能实例化的类,它们只能作为其他类的父类。一个包含一个或多个纯虚函数的类称为抽象类,一个没有具体实现的函数称为纯虚函数,只有从一个抽象类派生的类以及为所有纯虚函数提供了实现代码的类才能被实例化。一般来说,若一个类有一个纯虚函数,它可能同时需要一个虚析构函数。所以类设计层次如下:

 

 

clip_image004

 

 

代码:

 

Tree.h

 

#if !defined (TREE_H)
#define TREE_H
// (c) Bartosz Milewski 2000

class Node
{
public:
    virtual ~Node () {}//
设置一个虚析构函数
    virtual double Calc () const = 0;//
设置一个纯虚函数,也就是=0的意义所在。
};

class NumNode: public Node//
继承了Node
{
public:
    NumNode (double num) : _num (num ) {}
    double Calc () const;
private:
    const double _num;
};

class BinNode: public Node
{
public:
    BinNode (Node * pLeft, Node * pRight)
        : _pLeft (pLeft), _pRight (pRight) {}
    ~BinNode ();
protected: //
使用protected的原因是它可以被派生类直接使用,这样我们不用提供settergetter来进行访问了。

    Node * const _pLeft;
    Node * const _pRight;
};

class AddNode: public BinNode
{
public:
    AddNode (Node * pLeft, Node * pRight)
        : BinNode (pLeft, pRight) {}
    double Calc () const;
};

class MultNode: public BinNode
{
public:
    MultNode (Node * pLeft, Node * pRight)
        : BinNode (pLeft, pRight) {}
    double Calc () const;
};

#endif

 

Tree.cpp

 

// (c) Bartosz Milewski 2000
#include "Tree.h"
#include <iostream>

double NumNode::Calc () const
{
    std::cout << "Numeric node " << _num << std::endl;
    return _num;
}

BinNode::~BinNode ()
{
    delete _pLeft;
    delete _pRight;
}

double AddNode::Calc () const
{
    std::cout << "Adding/n";
    return _pLeft->Calc () + _pRight->Calc (); //
直接访问父类protected成员
}

double MultNode::Calc () const
{
    std::cout << "Multiplying/n";
    return _pLeft->Calc () * _pRight->Calc () ;//
直接访问父类protected成员
}

int main ()
{    
    // ( 20.0 + (-10.0) ) * 0.1
    Node * pNode1 = new NumNode (20.0);
    Node * pNode2 = new NumNode (-10.0);
    Node * pNode3 = new AddNode (pNode1, pNode2);
    Node * pNode4 = new NumNode (0.1);
    Node * pNode5 = new MultNode (pNode3, pNode4);
    std::cout << "Calculating the tree/n";
    // tell the root to calculate itself 
,从根开始计算

    double x = pNode5->Calc (); 
    std::cout << "Result: " << x << std::endl;
    delete pNode5; // and all children
}

 

注:要是用C语言进行实现的时候我们不可以避免使用Switch语句,这个例子也说明在C++中仅在不能使用多态的时候使用Switch语句。

 

参考文献:http://www.informit.com/articles/article.aspx?p=21484

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
29天前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
26 0
|
29天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
38 0
|
1天前
|
C++
C++:深度解析与实战应用
C++:深度解析与实战应用
7 1
|
4天前
|
编译器 C++
c++的学习之路:23、多态(2)
c++的学习之路:23、多态(2)
17 0
|
23天前
|
C++
C++ While 和 For 循环:流程控制全解析
本文介绍了C++中的`switch`语句和循环结构。`switch`语句根据表达式的值执行匹配的代码块,可以使用`break`终止执行并跳出`switch`。`default`关键字用于处理没有匹配`case`的情况。接着,文章讲述了三种类型的循环:`while`循环在条件满足时执行代码,`do/while`至少执行一次代码再检查条件,`for`循环适用于已知循环次数的情况。`for`循环包含初始化、条件和递增三个部分。此外,还提到了嵌套循环和C++11引入的`foreach`循环,用于遍历数组元素。最后,鼓励读者关注微信公众号`Let us Coding`获取更多内容。
21 0
|
29天前
|
编译器 C++
C++之多态
C++之多态
|
30天前
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
70 2
|
1月前
|
安全 网络性能优化 Android开发
深入解析:选择最佳C++ MQTT库的综合指南
深入解析:选择最佳C++ MQTT库的综合指南
87 0
|
1月前
|
存储 并行计算 算法
C++动态规划的全面解析:从原理到实践
C++动态规划的全面解析:从原理到实践
95 0
|
1月前
|
算法 Java C++
【C/C++ 内存知识扩展】内存不足的可能性分析
【C/C++ 内存知识扩展】内存不足的可能性分析
12 0

热门文章

最新文章

推荐镜像

更多