c++中的10种常见继承

下面的代码部分可能存在错误,主要是理解继承的思想。
	普通公有派生
#include <iostream.h>
class Base
{
private:
    int b_number;

public:
    Base() {}
    Base(int i) : b_number(i) {}
    int get_number() { return b_number; }
    void print() { cout << b_number << endl; }
};
class Derived : public Base
{
private:
    int d_number;

public:
    // constructor, initializer used to initialize the base part of a Derived object.
    Derived(int i, int j) : Base(i), d_number(j){};
    // a new member function that overrides the print( ) function in Base
    void print()
    {
        cout << get_number() << " ";
        // access number through get_number( )
        cout << d_number << endl;
    }
};
int main()
{
    Base a(2);
    Derived b(3, 4);
    cout << "a is ";
    a.print(); // print( ) in Base
    cout << "b is ";
    b.print(); // print( ) in Derived
    cout << "base part of b is ";
    b.Base::print(); // print( ) in Base
    return 0;
}
没有虚析构函数,继承类没有析构
#include <iostream.h>
#include <string.h>
class Thing
{
public:
    virtual void what_Am_I() { cout << "I am a Thing./n"; }
    ~Thing() { cout << "Thing destructor" << endl; }
};
class Animal : public Thing
{
public:
    virtual void what_Am_I() { cout << "I am an Animal./n"; }
    ~Animal() { cout << "Animal destructor" << endl; }
};
void main()
{
    Thing *t = new Thing;
    Animal *x = new Animal;
    Thing *array[2];
    array[0] = t; // base pointer
    array[1] = x;
    for (int i = 0; i < 2; i++)
        array->what_Am_I();
    delete array[0];
    delete array[1];
    return;
}
纯虚函数,多态
#include <iostream.h>
#include <math.h>
class Point
{
private:
    double x, y;

public:
    Point(double i, double j) : x(i), y(j) {}
    void print() const
    {
        cout << "(" << x << ", " << y << ")";
    }
};
class Figure
{
private:
    Point center;

public:
    Figure(double i = 0, double j = 0) : center(i, j) {}
    Point &location() { return center; } // return an lvalue
    void move(Point p)
    {
        center = p;
        draw();
    }
    virtual void draw() = 0; // draw the figure
    virtual void rotate(double) = 0;
    // rotate the figure by an angle
};
class Circle : public Figure
{
private:
    double radius;

public:
    Circle(double i = 0, double j = 0, double r = 0) : Figure(i, j), radius(r) {}
    void draw()
    {
        cout << "A circle with center ";
        location().print();
        cout << " and radius " << radius << endl;
    }
    void rotate(double)
    {
        cout << "no effect./n";
    } // must be defined
};
class Square : public Figure
{
private:
    double side;  // length of the side
    double angle; // the angle between a side and the x-axis
public:
    Square(double i = 0, double j = 0, double d = 0, double a = 0) : Figure(i, j), side(d), angle(a) {}
    void draw()
    {
        cout << "A square with center ";
        location().print();
        cout << " side length " << side << "./n"
             << "The angle between one side and the X-axis is " << angle << endl;
    }
    void rotate(double a)
    {
        angle += a;
        cout << "The angle between one side and the X-axis is " << angle << endl;
    }
    void vertices()
    {
        cout << "The vertices of the square are:/n";
        // calculate coordinates of the vertices of the square
    }
};
int main()
{
    Circle c(1, 2, 3);
    Square s(4, 5, 6);
    Figure *f = &c, &g = s;
    f->draw();
    f->move(Point(2, 2));
    g.draw();
    g.rotate(1);
    s.vertices();
    // Cannot use g here since vertices( ) is not a member of Figure.
    return 0;
}
```cpp
多继承
#include <iostream.h>
class A
{
private:
    int a;

public:
    A(int i) : a(i) {}
    virtual void print() { cout << a << endl; }
    int get_a() { return a; }
};
class B
{
private:
    int b;

public:
    B(int j) : b(j) {}
    void print() { cout << b << endl; }
    int get_b() { return b; }
};
class C : public A, public B
{
    int c;

public:
    C(int i, int j, int k) : A(i), B(j), c(k) {}
    void print()
    {
        A::print();
        B::print();
    }
    // use print( ) with scope resolution
    void get_ab() { cout << get_a() << " " << get_b() << endl; }
    // use get_a( ) and get_b( ) without scope resolution
};
int main()
{
    C x(5, 8, 10);
    A *ap = &x;
    B *bp = &x;
    ap->print(); // use C::print( );
    bp->print(); // use B::print( );
    //        bp -> A::print( );                // as if x is inherited from B only,
    // cannot access A::print( );
    x.A::print(); // use A::print( );
    x.get_ab();
    return 0;
}
共同基类的多继承
#include <iostream.h>
class R
{
    int r;

public:
    R(int anInt) { r = anInt; };
    printOn() { cout << "r=" << r << endl; };
};
class A : public R
{
    int a;

public:
    A(int int1, int int2) : R(int2) { a = int1; };
};
class B : public R
{
    int b;

public:
    B(int int1, int int2) : R(int2) { b = int1; };
};
class C : public A, public B
{
    int c;

public:
    C(int int1, int int2, int int3) : A(int2, int3), B(int2, int3) { c = int1; }
};
int main()
{
    int i;
    R rr(10);
    A aa(20, 30);
    B bb(40, 50);
    C cc(5, 7, 9);
    rr.printOn();
    aa.printOn(); //inherits R printOn
    bb.printOn(); //inherits R printOn
    //cc.printOn();                  //would give error
    return 0;
}
虚基类
#include <iostream.h>
class R
{
    int r;

public:
    R(int x = 0) : r(x) {} // constructor in R
    void f() { cout << "r=" << r << endl; }
    void printOn() { cout << "printOn R=" << r << endl; }
};
class A : public virtual R
{
    int a;

public:
    A(int x, int y) : R(x), a(y) {} // constructor in A
    void f()
    {
        cout << "a=" << a << endl;
        R::f();
    }
};
class B : public virtual R
{
    int b;

public:
    B(int x, int z) : R(x), b(z) {} // constructor in B
    void f()
    {
        cout << "b=" << b << endl;
        R::f();
    }
};
class C : public A, public B
{
    int c;

public:
    // constructor in C, which constructs an R object first
    C(int x, int y, int z, int w) : R(x), A(x, y), B(x, z), c(w) {}
    void f()
    {
        cout << "c=" << c << endl;
        A::f();
        B::f();
    }
};
void main()
{
    R rr(1000);
    A aa(2222, 444);
    B bb(3333, 111);
    C cc(1212, 345, 123, 45);
    cc.printOn(); //uses R printOn but only 1 R..no ambiguity
    cc.f();       // shows multiple call of the R::f()
}
私有继承
#include <iostream.h>
class Base
{
private:
    int priv;

protected:
    int prot;
    int get_priv() { return priv; }

public:
    int publ;
    Base();
    Base(int a, int b, int c) : priv(a), prot(b), publ(c) {}
    int get_prot() { return prot; }
    int get_publ() { return publ; }
};
class Derived1 : private Base // private inheritance{
                 public : Derived1(int a, int b, int c) : Base(a, b, c)
{
} int get1_priv() { return get_priv(); }
// priv not accessible directly
int get1_prot() { return prot; }
int get1_publ() { return publ; }
}
;
class Leaf1 : public Derived1
{
public:
    Leaf1(int a, int b, int c) : Derived1(a, b, c) {}
    void print()
    {
        cout << "Leaf1 members: " << get1_priv() << " "
             //                        << get_priv( )        // not accessible
             << get1_prot() << " "
             //                        << get_prot( )         // not accessible
             //                        << publ         // not accessible
             << get1_publ() << endl;
    } // data members not accessible.  get_ functions in Base not accessible
};
class Derived2 : protected Base // protected inheritance
{
public:
    Derived2(int a, int b, int c) : Base(a, b, c) {}
};
class Leaf2 : public Derived2
{
public:
    Leaf2(int a, int b, int c) : Derived2(a, b, c) {}
    void print()
    {
        cout << "Leaf2 members: " << get_priv() << " "
             //                        << priv                 // not accessible
             << prot << " "
             << publ << endl;
    } // public and protected data members accessible.  get_ functions in Base accessible.
};
class Derived3 : public Base // public inheritance
{
public:
    Derived3(int a, int b, int c) : Base(a, b, c) {}
};
class Leaf3 : public Derived3
{
public:
    Leaf3(int a, int b, int c) : Derived3(a, b, c) {}
    void print()
    {
        cout << "Leaf3 members: " << get_priv() << " "
             << prot << " "
             << publ << endl;
    } // public and protected data members accessible.  get_ functions in Base accessible
};
int main()
{
    Derived1 d1(1, 2, 3);
    Derived2 d2(4, 5, 6);
    Derived3 d3(7, 8, 9);
    //        cout << d1.publ;                // not accessible
    //        cout << d1.get_priv( );        // not accessible
    //        cout << d2.publ;                // not accessible
    //        cout << d2.get_priv( );        // not accessible
    cout << d3.publ;       // OK
    cout << d3.get_prot(); // OK
    Leaf1 lf1(1, 2, 3);
    Leaf2 lf2(4, 5, 6);
    Leaf3 lf3(7, 8, 9);
    //         cout << lf1.publ << endl;                    // not accessible
    //         cout << lf2.publ << endl;                // not accessible
    cout << lf3.publ << endl; // OK
    return 0;
}
多级继承
#include <iostream.h>
// THE POINT CLASS
class Point
{
    friend ostream &operator<<(ostream &, Point &);

public:
    //  constructor
    Point(double xval = 0, double yval = 0)
    {
        x = xval;
        y = yval;
    };

protected: // accessed by derived class
    double x;
    double y;
};
ostream &operator<<(ostream &os,
                    Point &apoint)
{
    cout << " Point:X:Y: " << apoint.x << ","
         << apoint.y << "/n";
    return os;
}
//The Circle class  inherits from class Point
class Circle : public Point
{
    friend ostream &operator<<(ostream &, Circle &);

public:
    Circle(double r = 0, double xval = 0, double yval = 0)
        : Point(xval, yval), radius(r)
    {
        //radius = r;
    }
    double area()
    {
        return (3.14159 * radius * radius);
    }

protected:
    double radius;
};
//note casting circle to point
ostream &operator<<(ostream &os, Circle &aCircle)
{
    cout << "Circle:radius:" << aCircle.radius;
    os << aCircle.x << "/n";
    os << aCircle.y << "/n";
    return os;
}
// THE CYLINDER CLASS
class Cylinder : public Circle
{
    friend ostream &operator<<(ostream &, Cylinder &);

public:
    Cylinder(double hv = 0, double rv = 0,
             double xv = 0, double yv = 0)
        : Circle(xv, yv, rv)
    {
        height = hv;
    }
    double area();

protected: // may have derived classes
    double height;
};
double Cylinder ::area()
{ // Note that cylinder area uses Circle area
    return 2.0 * Circle::area() + 2.0 * 3.14159 * radius * height;
}
ostream &operator<<(ostream &os,
                    Cylinder &acylinder)
{
    cout << "cylinder dimensions: ";
    cout << "x: " << acylinder.x;
    cout << "  y: " << acylinder.y;
    cout << "  radius: " << acylinder.radius;
    cout << "  height: " << acylinder.height
         << endl;
    return os;
}
int main(void)
{
    Point p(2, 3);
    Circle c(7, 6, 5);
    Cylinder cyl(10, 11, 12, 13);
    cout << p;
    cout << c;
    cout << "area of cirle:" << c.area() << endl;
    cout << cyl;
    cout << "area of cylinder:" << cyl.area() << endl;
    cout << "area of cylinder base is "
         << cyl.Circle::area() << endl;
    return 0;
}
protected
访问控制属性在继承的意义
#include <iostream.h>
// THE POINT CLASS
class Point
{
    friend ostream &operator<<(ostream &, Circle &);

public:
    Point(double xval = 0, double yval = 0)
    {
        x = xval;
        y = yval;
    };

public:
    void print()
    {
        cout << " Point:X:Y: " << x << "," << y << "/n";
    }

protected: // accessed by derived class
    double x;
    double y;
};
ostream &operator<<(ostream &os, Point &apoint)
{
    cout << " Point:X:Y: " << apoint.x << "," << apoint.y << "/n";
    return os;
}
//The Circle class  inherits from class Point
class Circle : public Point
{
    friend ostream &operator<<(ostream &, Circle &);

public:
    Circle(double r = 0, double xval = 0, double yval = 0) : Point(xval, yval)
    {
        radius = r;
    };
    void print()
    {
        cout << "Circle:radius:" << radius << endl;
        cout << " Point:X:Y: " << x << "," << y << "/n";
    }
    double area()
    {
        return (3.14159 * radius * radius);
    };

protected:
    double radius;
};
//note casting circle to point
ostream &operator<<(ostream &os, Circle &aCircle)
{
    cout << "Circle:radius:" << aCircle.radius;
    cout << (Point)aCircle << "/n";
    return os;
}
//We will look at a few main programs based on previous class definitions. Casting and assignments
void main(void)
{
    Point p(2, 3);
    cout << "Point P=  " << p;
    Point pp(0, 0);
    cout << "Point PP=  " << pp;
    Circle c(7, 6, 5);
    cout << "Circle c=  " << c; //radius =7
    pp = p;
    cout << "Point PP=  " << pp; //built in assign =
    // a circle is a member of the point class so assign a circle to a point.
    pp = c; //legal; also assignment O.K.
    cout << "Point PP=  " << pp;
    pp = (Point)c;               // but better  use the cast
    cout << "Point PP=  " << pp; //note we get only the point part of the Circle
    //c = (Circle) pp;   //  illegal Cannot convert 'class Point' to 'class Circle'
    //c=pp;                 //illegal assignment not defined
    Point *p;
    p = &c;
    P->print(); //call base class print
    ((Circle *)p)->print();
    Point &r = c;
    r.print();
    ((Circle &)r).print();
}
类的兼容性规则
#include <iostream.h>
class Base
{
public:
    void func()
    {
        cout << "Base class function./n";
    }
};
class Derived : public Base
{
public:
    void func()
    {
        cout << "Derived class function./n";
    }
};
void foo(Base b)
{
    b.func();
}
int main()
{
    Derived d;
    Base b;
    Base *p = &d;
    Base &br = d;
    b = d;
    b.func();
    d.func();
    p->func();
    foo(d);
    br.func();
    return 0;
}
虚析构函数,防止内存泄露
#include <iostream.h>
#include <string.h>
class Base
{
protected:
    int id;
    char *name;

public:
    // default constructor
    Base(int a = 0, char *s = "") : id(a)
    {
        if (!s)
        {
            name = NULL;
        }
        else
        {
            name = new char[strlen(s) + 1];
            strcpy(name, s);
        }
        cout << "base default constructor/n";
    }
    // copy constructor
    Base(const Base &b) : id(b.id)
    {
        if (!b.name)
        {
            name = NULL;
        }
        else
        {
            name = new char[strlen(b.name) + 1];
            strcpy(name, b.name);
        }
        cout << "base copy constructor/n";
    }
    // destructor
    ~Base()
    {
        if (name != NULL)
            delete[] name;
        cout << "base destructor/n";
    }
    const Base &operator=(const Base &b);
    friend ostream &operator<<(ostream &, const Base &);
};
const Base &Base : perator = (const Base &b)
{
    if (this != &b) // Check if an object is assigned to itself.
    {
        id = b.id;
        delete[] name; //  Destroy the old object.
        if (!b.name)
        {
            name = NULL;
        }
        else
        {
            name = new char[strlen(b.name) + 1];
            strcpy(name, b.name);
        }
    }
    cout << "base assignment operator/n";
    return *this;
}
ostream &operator<<(ostream &out, const Base &b)
{
    out << "Base member id = " << b.id << endl;
    out << "Base member name = " << b.name << endl;
    return out;
}
class Derived : public Base
{
private:
    float f;
    char *label;

public:
    // default constructor
    Derived(int a = 0, char *s = "", float x = 0, char *t = "") : Base(a, s), f(x)
    {
        if (!t)
        {
            label = NULL;
        }
        else
        {
            label = new char[strlen(t) + 1];
            strcpy(label, t);
        }
        cout << "derived default constructor/n";
    }
    // copy constructor
    Derived(const Derived &d) : Base(d), f(d.f)
    // d used as an instance of Base
    {
        if (!d.label)
        {
            label = NULL;
        }
        else
        {
            label = new char[strlen(d.label) + 1];
            strcpy(label, d.label);
        }
        cout << "derived copy constructor/n";
    }
    // destructor
    ~Derived()
    {
        delete[] label;
        cout << "derived destructor/n";
    }
    const Derived &operator=(const Derived &d);
    friend ostream &operator<<(ostream &, const Derived &);
};
const Derived &Derived : perator = (const Derived &d)
{
    if (this != &d)
    {
        delete[] label;
    Base:
        perator = (d); //  Assign the Base part of d to the Base
        // part of the object that calls this operator;
        f = d.f;
        if (!d.label)
        {
            label = NULL;
        }
        else
        {
            label = new char[strlen(d.label) + 1];
            strcpy(label, d.label);
        }
        cout << "derived assignment operator/n";
    }
    return *this;
}
ostream &operator<<(ostream &out, const Derived &d)
{
    out << (Base)d; // Convert d to Base object to output Base members.
    out << "Derived member f = " << d.f << endl;
    out << "Derived member label = " << d.label << endl;
    return out;
}
int main()
{
    Derived d1;
    Derived d2(d1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值