zoukankan      html  css  js  c++  java
  • C++虚函数与多态

    虽然写过一些C++程序,有类有继承,但对虚函数和多态用的不多,最近想尝试一下多态,却出了些问题。于是不得不重新来学习虚函数与多态。
    简单的示例程序如下,

    class Lexer
    {
    public:
        Lexer(){}
        Lexer(string t){
            name = "Lexer";
            text = t;
        }
        virtual void Print(){
            cout << name << ":" << text << endl;
        }
    protected:
        string name;
        string text;
    };
    
    class ExprLexer : public Lexer
    {
    public:
        ExprLexer(){}
        ExprLexer(string t,string r):Lexer(t){
            name = "ExprLexer";
            expr = r;
        }
        void Print(){
            cout << name << ":" << text << "," << expr << endl;
        }
    protected:
        string expr;
    };
    
    class Parser
    {
    public:
        Parser(Lexer l){
            lexer = l;    
            // lexer = &l; //虽然这样修改,但结果没什么变化
        }
        void Print(){
            lexer.Print();
            // lexer->Print();    
        }
    protected:
        Lexer lexer;
        // Lexer *lexer;
    };

    输出结果如下,

    输出结果却不是我所期望的,多态和虚函数为什么没有作用呢?我在《C++程序设计语言(特别版)》的278页找到了答案。
    “从Employee的函数中取的'正确的'行为,而又不依赖于实际使用的到底是哪一种Employee,这就是所谓的多态性。一个带有虚函数的类型被称为多态类型。要在C++里取的多态的行为,被调用的函数就必须是虚函数,而对象则必须是通过指针或者引用去操作的。如果直接操作一个对象(而不是通过指针或引用),它的确切类型就已经为编译器所知,因此也就不需要运行时的多态性了。”

    读完这段话,如醍醐灌顶,发现自己根本就不会用多态和虚函数。C++白学了这么多年啊。下面对Parser类做些简单的修改,就可以了,修改之后的代码如下,

    class Parser
    {
    public:
        Parser(Lexer* l){
            lexer = l;    
        }
        void Print(){
            lexer->Print();    
        }
    protected:
        Lexer *lexer;
    };

    主程序也需要稍作修改,如下,

    int main()
    {
        Lexer A("hello,A");
        ExprLexer B("hello,B","1+1=2");
        A.Print();
        B.Print();    
    
        Parser C(&A);
        C.Print();
        Parser D(&B);
        D.Print();
        
        return 0;
    }

    得到输出,

    总算得到期望的结果了。多态和虚函数还是蛮好用的哈。

  • 相关阅读:
    用SQL语言操作数据
    用表组织数据
    第一个C#程序
    利用CSS3制作网页动画
    CSS3美化网页元素
    列表、表格与媒体元素
    表单
    HTML5基础
    使用Java编译思想
    Day06:方法 / 猜字母游戏
  • 原文地址:https://www.cnblogs.com/Frandy/p/cpp_virtual_polymorphism.html
Copyright © 2011-2022 走看看