C/C++ 初学简单笔记 —3— 继承与派生

来源:互联网 发布:arc map空间数据编辑 编辑:程序博客网 时间:2024/05/23 14:10

1. 继承方式有: private, protected, public  (3p,美国佬就是重口味) 

继承的权限是向下的。

用public 继承,则基类成员原有权限保持不变

用protected继承,则public的都变为protected。protected和private的成员权限不变

用private继承,则全部都变为private。

注:没写继承方式,默认为 private


2. 子类调用父类方法

B b;   // class B:public A

b.A::show();    // 在show前面加上域运算符,表示是调用哪个父类的成员方法


3.虚基类,就是为了解决C++中,共同基类多级多脉同名成员的处理。

假设

class A;   // 有共有成员 n

class B:public A

class C:public A

class T:public B, public C    // B,C有共同基类

T t;

t.n; // 出错,因为B中有n, C中也有n, 编译器不知道该怎么读取。


解决办法

class B:virtual public A

class C:virtual public A       // virtual 只对紧跟其后的基类起作用。


这样的话,就相当于将共同的基类虚拟化了。

只有最底层的派生类对虚基类构造函数进行调用,而别的类则不对虚基类构造函数进行调用

声明为虚基类的作用就是为了使基类只进行一次实例化。


注意:在虚基类中,子类必须提供虚基类的初始化列表,若没,则调用默认构造函数。


4. 类的赋值兼容规则,其实就是父类声明,子类对象。

class A;

class B:A

B b;

A a = b;

A *pa = &b;      // 指针只会指向原基类的成员组地址,然后赋值给父类

A &aa = b;       // 注意:只能是子类赋值给父类,而不能父类赋值给子类

以上声明,实际上就是将子类中继承的原基类成员赋值给父类,所以父类自然只能访问自己的成员,而不能去访问子类的成员。


若要访问基类成员,则必须将父类声明强制转换为子类类型才可以。

(B)(a);

(B*)(pa);

(B&)(aa);     // 转换为子类类型后,就能访问子类的成员了。


5. 虚函数,就是为了解决类的赋值兼容中,父类能够直接调用子类的方法。

在基类的成员函数前用virtual修饰,表明如果子类有了方法A,那么就调用子类的相应方法,如果子类没有,最后才调用父类的成员方法A。


检测测试代码

#include <iostream>

using namespace std;

class A
{
    public:
        virtual void show()      // 如果不用virtual修饰的话,那么调用的结果是 B::show
        {
            cout<<"A::show"<<endl;
        }
};

class B:public A
{
    public:
        void show()                 // 用virtual修饰后,就会调用这个方法,如果B中没有这个方法,那么就自动调用父类的方法。
        {
            cout<<"B::show"<<endl;
        }
};

int main()
{
    A *a = new B();
    a->show();

    return 0;
}


1 0
原创粉丝点击