美文网首页
3.2C++基类和派生类的赋值

3.2C++基类和派生类的赋值

作者: tomchan | 来源:发表于2015-10-06 17:38 被阅读70次

    请看下面一个完整的例子:

    #include

    using namespace std;

    class A{

    public:

    int n;

    A(int n):n(n){}

    void display(){ cout<<"Class A: n="<<n<<endl;}

    };

    class B: public A{

    public:

    B(int n):A(n){}

    void display(){ cout<<"Class B: n="<<n<<endl;}

    };

    class C: public A{

    public:

    C(int n):A(n){}

    void display(){ cout<<"Class C: n="<<n<<endl;}

    };

    int main(){

    A a(1);

    B b(2);

    C c(3);

    a.display();

    a = b;

    b.n = 100;

    a.display();

    a = c;

    a.display();

    return 0;

    }

    运行结果:

    Class A: n=1

    Class A: n=2

    Class A: n=3

    本例中,将 b 对象赋值给 a 对象,等价于 a.n = b.n,赋值完成后 a.n 的值为 2,然后调用 a.display() 函数,输出结果就是”Class A: n=2“。将 c 对象赋值给 a 对象也是同样的道理。

    这个例子很好的说明了:基类对象和派生类对象之间的赋值仅仅是对应的成员变量的赋值,不会影响成员函数,不会影响 this 指针。

    指向对象的指针

    对上例 main 函数中的代码做如下更改:

    A *p = new A(1);

    p->display();

    p = new B(2);

    p->n = 100;

    p->display();

    p = new C(3);

    p->display();

    输出结果:

    Class A: n=1

    Class A: n=100

    Class A: n=3

    本例定义了一个指针,使它指向不同的对象。与上例不同的是,本例中并没有发生对象的赋值,仅仅是改变了指针的指向。

    将 p 指向 B 类的对象,隐式指针 this 也随之改变,指向 B 类的对象,所以 p->n 和 this->n 访问的都是 B 类对象的成员变量,输出结果显然是”n=100“。

    细心读者可能已经发现,虽然 this 指向了 B 类对象,但是 p->display() 依然调用 A 类的成员函数。这是因为,成员变量和成员函数不在同一个内存区域,系统通过 this 指针来访问成员变量,但是却不通过它来访问成员函数。

    如果希望通过 p 指针访问 B类的成员函数,可以将该成员函数声明为虚函数 ,详情看第四章。

    相关文章

      网友评论

          本文标题:3.2C++基类和派生类的赋值

          本文链接:https://www.haomeiwen.com/subject/pimgcttx.html