欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++面向对象程序设计详情

程序员文章站 2022-04-23 17:10:43
C++面向对象程序设计 在C++语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定,即JAVA中的多态 基类通常要定义一个虚析构函数,即使该函数不执行任何实际操作,...

C++面向对象程序设计

在C++语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定,即JAVA中的多态 基类通常要定义一个虚析构函数,即使该函数不执行任何实际操作,也是如此。 在C++中基类的成员函数有两种:1、基类希望派生类进行重写的函数;2、基类希望派生类直接继承而不用改变的函数。对于前者,基类将其定义为虚函数。当指针或引用调用虚函数时,该调用将被动态绑定(即多态)。 任何构造函数之外的非static函数都可以是虚函数。关键字virtual只能出现在类内部的函数声明语句之前,而不能出现在类外部的函数定义语句之前。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。 如果成员函数没有被声明成虚函数,则其解析过程发生在编译时而非运行时。所以在继承层次中,该函数只有一个,不能被重写成多个版本。 派生类必须重新声明基类中所有的虚函数。派生类可以在这样的函数前加上关键字virtual,但并非非得这样做。 如果派生列表中基类的访问控制符为public,我们可以将派生类型的对象绑定到基类的引用或指针上。 派生类虽然有基类的数据成员,但是也只能通过基类的构造函数来初始化它们。
class A {
    public:
        int a;
        A(int p):a(p) {}
}

class B : public A {
    public:
        int b;
        B(int p1, int p2):A(p1), b(p2) {}
}

//B的构造函数先由A的构造函数初始化a,然后执行A的构造函数体,接着初始化b,最后执行B的构造函数体
//派生类声明时,声明中包含类名但是不包含它的派生列表
class B : public A;//错误
class B;//正确
如果某个类被当作基类,则该类必须被定义,而不能仅仅被声明。
class A; //仅仅声明了A类
class B : public A {
    ...
} //错误,A类必须被定义
从派生类向基类的类型转换只对指针或引用类型有效 基类向派生类不存在隐式的类型转换 当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中基类的部分会被拷贝、移动、赋值,它的派生类部分将被忽略掉。所以得到的基类对象无法强制转换成派生类对象。
class A {}
class B : public A {}
B b;
A a(b);//实际上,调用的是拷贝构造函数,即A::A(const A&)
a = b;//实际上,调用的是拷贝赋值运算符,即A::operator=(const A&)
列表内容