zoukankan      html  css  js  c++  java
  • C++ 继承

    1.继承使用的场合:写一个class,这个class和以前写过的class相比,只是增加一些成员或者对原来的成员的行为有修改,则可以继承原来的class,语法不展开说,通过代码写写几句总结。

    #include    <iostream>
    using namespace std;
    
    class  A {
    public:
        virtual void  f(void) { cout << "A'f(void)!" << endl; }
        virtual void vf() { cout << " A'vf()  running !" << endl; }
    };
    
    class  B : public  A {
    public:
        void  f(int) { cout << "B'f(int)!" << endl; }
        virtual void  vf() { cout << " B'vf()  running !" << endl; }
    };
    
    int  main() {
        B  b;
        A  &a = b;
    
        A  *pa;
        B  *pb;
    
        a.f();                   //A'f(void)!
        pa = &b;
    
        pa->f();                 //A'f(void)!
        b.f(3);                  //B'f(int)!
    
        pa = new  A;
        pa->vf();                //A'vf()  running !
        delete  pa;
        pa = NULL;
        delete  pa;
    
        pa = new  B;
        pa->vf();                 //B'vf()  running !
        delete  pa;
    
        pb = new B;
        pb->vf();                 //B'vf()  running !                
    
        pb->A::f();               //A'f(void)!  
         pb->B::f(3);             //B'f(int)!
    
        delete  pb;
    
      return 0;
    }

    基类指针创建子类对象,同名同参函数,优先调用子类函数。

    2.句柄类

    以前的博文写得过于繁琐,几天前重新梳理了一下句柄类的 实现考虑 动机,以一个简单的句柄类来说明。

    #include <iostream>
    using namespace std;
    
    class A {
    protected:
        int len;
        virtual A* clone() { return new A(*this); }
    private:
        int HandleA;
        friend class Handle;
    public:
        A() :HandleA(0) { }
        A(int a) { HandleA = a; }
        A(istream& is) { read(is); };
    
        virtual istream& read(istream& is);
    
        virtual int sum() { cout << "A'sum()" << endl; return HandleA + 100; }
        virtual ~A() {};
    
    };
    
    istream& A::read(istream& is) {
        is >> HandleA;
        return is;
    }
    
    
    
    class B : public A {
    public:
        B() :HandleB(24) { }
        B(int b) { HandleB = b; }
        B(istream& is) { read(is); }
    
        istream& read(istream& is);
    
        int sum() { cout << "B'sum()" << endl; return HandleB + 1000; }
    protected:
        B* clone() { return new B(*this); }    //private & protected both OK!
    private:
    
        int HandleB;
    };
    
    istream& B::read(istream& is) {
        is >> HandleB;
        return is;
    }
    
    class Handle {
    public:
        Handle() :pa(0) {}
        istream& read(istream& is);
    
        Handle(Handle& f) { if (f.pa) pa = f.pa->clone(); else pa = 0; }
        Handle& operator= (Handle& f) {
            if (&f != this) {
                delete pa;
                if (f.pa) pa = f.pa->clone();
                else pa = 0;
            }
            return *this;
        }
        int sum() {
            if (pa) return pa->sum();
            else { cout << "Handle's sum" << endl; pa = 0; return 42; }
        }
        ~Handle() { delete pa; }
    
    private:
        A* pa;
    };
    istream& Handle::read(istream& is) {
        delete pa;
        char ch;
        is >> ch;
        if (ch == 'a' || ch == 'A') {
            pa = new A(is);
        }
        else if (ch == 'b' || ch == 'B') {
            pa = new B(is);
        }
        else {
            pa = 0;
        }
        return is;
    }
    
    int main()
    {
        Handle f;
    
        cout << "Input A or B?" << endl;
        f.read(cin);
        Handle g(f);
        Handle h = f;
    
        cout << f.sum() << endl;
        cout << g.sum() << endl;
        cout << h.sum() << endl;
    
            return 0;    
    }
  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/hanxinle/p/5528546.html
Copyright © 2011-2022 走看看