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

    得到输出,

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

  • 相关阅读:
    珠海洪锐在线监测agent_linux系统
    python中的不定长参数
    记一次刻苦铭心得安装zabbix经历
    狼书第三章Jinja2模板总结
    关于消息闪现的问题
    了解HTTP状态码
    关于用Flask建立一个简单的web应用
    将模块安装到Site-packages
    在Centos6中安装python3.6
    unity 生成缩略图 , 图片缩放
  • 原文地址:https://www.cnblogs.com/Frandy/p/cpp_virtual_polymorphism.html
Copyright © 2020-2023  润新知